phpbar.de logo

Mailinglisten-Archive

[php] Ausführungszeit von MySQL-Abfragen

[php] Ausführungszeit von MySQL-Abfragen

Andreas Kempf andreas.kempf at amalesh.de
Do Dez 23 19:23:17 CET 2010


> Es sind die gleichen. Ich kopiere das vom Skript erzeugte SQL-Statement und füge es bei PHPMyAdmin ein.

Du kannst auch ein "EXPLAIN " vor dein "SELECT" setzen um zu sehen, was 
da passiert.

>> Kannst du mal den select-Befehl von phpMyAdmin (sollte da angezeigt werden)
>> und den von deinem Programm posten?
>
> SELECT g.uid AS id, g.url_name, g.restaurant_name AS real_name,
> g.adresse_1 AS address, g.plz AS zip, g.ort AS city, gaultmillau,
> 	tx_lgmapconnector_latitude AS latitude, tx_lgmapconnector_longitude AS longitude, '' AS distance,
> (SELECT COUNT(*) FROM tx_hegastro_schedule s WHERE s.date = '2010-12-21' AND s.status = '1'
[snip]

> Ich weiß, dass die Subselects die Performancekiller sind. Jeder von ihnen braucht ein paar Millisekunden.

So absurd es klingt, doch ist in bestimmten Konstellationen folgendes 
feststellbar: Es ist besser, die Subselects vorher auszuführen, dann die 
IDs in ein Array zu sammeln, was man anschließend über implode() zu 
einem kommaseparierten $strIDs umsetzt um dann über ein zweites Request 
"...where tabelle.ref_id in ($strIDs)..." die Records der Haupttabelle 
zu bekommen. Im Life-Betrieb lässt sich so u.U. der interne Cache besser 
ausnutzen.

Die Performance von MySQL hängt allerdings von vielen Faktoren ab. Es 
gibt auch keine allgemeingültige Empfehlung, wie man seine my.cnf zu 
optimieren hat, da zu viel von dem verfügbaren Speicher, sowie den 
eigenen Tabellen und Statements abhängt.

Btw, habe für goabase.com (Social Network mit 150 SQL-Abfragen pro 
Sekunde) zwei Maschinen laufen, einer Apache, der andere MySQL. Auf der 
MySQL-Maschine wurde inzwischen 80% des RAMs allein MySQL zugewiesen und 
zusätzlich das Hard-Swap ausgeschaltet, da der Cache von MySQL nicht 
nochmal auf einer Platte geschrieben werden muss.

> Die Frage bleibt, was PHPMyAdmin anders macht, damit diese Abfrage 10x schneller ausgeführt wird als durch mein Skript.

Wie an anderer Stelle geschrieben, hattest du das "LIMIT 30" vergessen. 
Ich wundere mich, dass es so einen eklatanten Unterschied macht. Denn 
das "ORDER BY real_name" erfordert ja, dass erstmal alle 10.000 
Records/Tupels gefunden werden müssen, von denen dann aber nur 30 
dargestellt werden sollen.

Wenn man die Performance einzelnder Statements testet, sollte man auch 
jedesmal vorher den Cache leeren ("reset query cache"). Man bekommt dann 
die echten Ergebnisse und nicht die cache-geschönten.

Empfehlen kann ich noch http://www.mysqlperformanceblog.com/
Besonders die älteren Beiträge aus 2006 und 2007 beschäftigen sich mit 
der Brot- und Butter-Thematik "Optimierung von MyISAM".

BG, Andreas

php::bar PHP Wiki   -   Listenarchive