Rolf B: mysql, Query optimieren

Beitrag lesen

Hallo Jörg,

Insgesamt ist auch eine deutliche Verbesserung der Geschwindigkeit erkennbar.

Um zu unterscheiden, ob Du die Zeit im PHP oder im SQL verlierst, musst Du die Laufzeiten Etappe für Etappe messen. PHP ist allerdings im Allgemeinen sehr flink, die Wahrscheinlichkeit, dass Du da viel Zeit verlierst, ist nicht so hoch.

$startzeit = microtime(true);   // true: Liefere Float-Wert

// SQL Statement ausführen

echo "\n<!-- Nach SQL: " . (microtime(true) - $startzeit) . "ms -->\n";

// PHP Verarbeitung

$zeile = 1;
while ($row = /* fetch */) {
   // Berechnungen und Ausgaben für die Zeile

   echo "\n<!-- Nach Zeile $zeile: " . (microtime(true) - $startzeit) . "ms -->\n";
   $zeile++;
}

Du musst bei den echos nur drauf achten, dass Du diese Kommentare nicht mitten in ein HTML Tag hinschreibst. Guck Dir die Seite dann im Quelltext an (-> Browser Entwicklertools) und du siehst, wo die Zeit verloren geht. Wenn Du ohnehin einen eigenen Zeilenzähler hast, brauchst Du natürlich keinen eigenen hinzuzufügen.

Wenn Du ein funktionierendes Logging hast, kannst Du statt der echos auch ins Log schreiben.

Ich kann mir vorstellen, dass Du irgendwo eine Zeile hast, die nach nichts besonderem aussieht, die aber sehr viel mehr Zeit braucht. Das würde darauf hindeuten, dass der Puffer von PHP für die Querydaten nicht ausreicht und es an irgendeinem Punkt den Rest lesen muss. Das sollte von mysqli_query eigentlich abgefangen werden, weil es das Ergebnis komplett liest - aber verwendest Du vielleicht mysqli_real_query? Oder ein prepared statement, das Du dann mit fetch Row by Row liest?

Ich kann mir auch vorstellen, dass die Zeiten unauffällig sind und das HTML Ergebnis trotzdem in zwei Schwüngen kommt. Das würde darauf hindeuten, dass PHP die Ausgabe puffert, der Puffer irgendwann voll ist und ausgegeben wird und dann der Rest kommt. Guck Dir in deiner PHP.INI mal an, was bei output_buffering angegeben ist (mit ini_get, falls Du die PHP.INI nicht direkt lesen kannst).

Rolf

--
sumpsi - posui - obstruxi