Mailinglisten-Archive |
ANGEL Harald schrieb: > Sebastian Mendel: >> Er soll die das slow query log schicken. >> Dort stehen alle Abfragen drin die zu lange brauchen oder keinen Index >> verwenden. > > Danke für den Tipp! > Hab das jetzt erhalten und angefangen, die SQLs zu durchforsten. > Da führt mich gleich zu einer kleinen Verständnisfrage und ich hoffe ihr könnt mir helfen: > > Dieser ansich einfache SQL: > SELECT meinung.* > FROM meinung > WHERE forumID = 30284 > ORDER BY meinung.threadid DESC, meinung.sort > LIMIT 0 , 30 > > sollte ja theoretisch nur 30 zeilen lesen. > Wenn ich mir den SQL allerdings mit EXPLAIN ansehe, sehe ich das: > key -> forumID > key_len -> 4 > ref -> const > rows -> 2604 > Extra -> Using where; Using filesort > > laut http://dev.mysql.com/doc/refman/4.0/de/explain.html ist rows ja die anzahl, die zeilen, die mysql untersuchen muss. > Was muss ich in meinem SQL ändern, damit der MYSQL wirklich nur die benötigten 30 zeilen untersuchen muss? > Oder ist das wegen dem ORDER BY? Richtig wenn du bei dem EXPLAIN das ORDER BY weglässt wirst du sicher sehen das er nicht alle 2604 Zeilen bruacht, das wirklich schlimme ist aber "Extra -> Using where; Using filesort" Ein ORDER BY ... DESC lässt sich aber schlecht optimieren in MySQL da MySQL noch keine Abwärtssotierten Schlüssel kann. Ich wüsste jetzt nicht wie du bei einem ORDER BY ... DESC das 'Using filesort' umgehen kannst, ohne das RE-Modell zu ändern. Aber vielleicht liegt die Lösung ja im Kontext, warum/weiso/wofür du die Daten dieser Abfrage überhaupt benötigst ... P.s. hast du einen eigenen DB-Server oder nur eine DB auf einem gemeinsamen DB-Server? Vielleicht kannst du ja mal fragen ob der query cache aktiviert ist. Das kann man auch in phpMyAdmin sehen, wo 'er' auch die anderen zwei Infos her hat. -- Sebastian Mendel www.sebastianmendel.de
php::bar PHP Wiki - Listenarchive