dedlfix: mysqli langsamer als mysql

Beitrag lesen

Tach!

Betrachte dabei aber nicht nur den mysqli->query Aufruf, sondern den kompletten Vorgang von query bis "letzte Row eingelesen".

PHP arbeitet bei MySQL so, dass bei einem Query automatisch im Hintergrund die Ergebnismenge vom Datenbankserver abgefragt und zwischengespeichert wird. Für mysqli_query() kann man das über den Parameter $resultmode steuern. Lässt man den auf dem Defaultwert stehen, ist der Vorgang bereits mit dem mysqli_query() komplett. Und selbst wenn man ungepuffert auf die Daten zugreift, ist es nicht unbedingt sinnvoll, bis zum "letzte Row eingelesen" zu messen. Man kann ja beliebig viel Code je Row ausführen, nicht unbedingt nur ein einfaches Kopieren in ein Array, zum Beispiel.

Beim Zwischenspeichern wird teilweise recht viel Speicher verwendet, weil Daten aus dem internen Puffer in Variablen kopiert werden müssen. Das Verhalten hat erst die Extension mysqlnd optimiert, so dass das über die PHP-übliche Quasi-Referenz ohne wirklich zu kopieren abgehandelt wird. Mit anderen Worten: schauen ob mysqlnd installiert ist (über phpinfo() beispielsweise). Es ändert sich an der Bedienung nichts, die geht weiterhin über mysqli. mysqlnd arbeitet unsichtbar im Hintergrund.

"PHP-übliche Quasi-Referenz" nenne ich mal das Copy-on-Write-Prinzip, das PHP beim Variablen-Handling anwendet. Wenn man einen Wert in einer Variable einer anderen Variable zuweist, wird der nicht direkt dupliziert, sondern es wird zunächst lediglich ein Verweis auf den bisherigen Wert in den Metadaten der neuen Variable notiert. Erst wenn die Daten geändert werden, wird die tatsächliche Kopie erzeugt.

dedlfix.