Mailinglisten-Archive |
> 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