Mailinglisten-Archive |
ANGEL Harald wrote: > Sebastian Mendel: >> generall hilft immer ein >> EXPLAIN [DEINE ABFRAGE] >> (geht auch über phpMyAdmin: [SQL Erklären]) > > Besten Dank für den Tipp! > Eine Frage hab ich noch zur HAVING - Clausel. Kann man da keine Indizes verwenden? HAVING verhält sich etwas anders WHERE, das es erst dann greift wenn alle Daten beriets 'zusammengetragen' wurden, WHERE hingegen greift beriets davor und verhindert so beriets das überhaupt Daten geholt werden die cniht gebraucht werden > > Ich hab zB diesen SQL um meine Charts anzuzeigen: > SELECT charts_lieder. * , SUM( charts_votes.punkte ) AS spunkte, user.nickname, user.farbe > FROM charts_lieder > LEFT JOIN charts_votes ON charts_lieder.id = charts_votes.liedid > LEFT JOIN user ON charts_lieder.userid = user.userid > GROUP BY charts_lieder.id > HAVING charts_lieder.kw = '46' > AND charts_lieder.jahr = '2005' > AND charts_lieder.art =1 > AND charts_lieder.rang <> 0 > AND charts_lieder.online =1 > ORDER BY charts_lieder.rang > > Dieser SQL dauert relativ lange (5-10sec) > Ich hab diesen Index angelegt: > ALTER TABLE `charts_lieder` ADD INDEX `kw_jahr_art` > (`kw`,`jahr`,`art`) > > Mach ich ein EXPLAIN sagt der aber, der verwendet den nicht. > Wie kann man diese Abfrage anders Tunen? probiers mal so: SELECT charts_lieder.*, SUM( charts_votes.punkte ) AS spunkte, user.nickname, user.farbe FROM charts_lieder LEFT JOIN charts_votes ON charts_lieder.id = charts_votes.liedid LEFT JOIN user ON charts_lieder.userid = user.userid WHERE charts_lieder.kw = '46' AND charts_lieder.jahr = '2005' AND charts_lieder.art = 1 AND charts_lieder.rang <> 0 AND charts_lieder.online =1 GROUP BY charts_lieder.id ORDER BY charts_lieder.rang -- Sebastian Mendel www.sebastianmendel.de www.sf.net/projects/phpdatetime | www.sf.net/projects/phptimesheet
php::bar PHP Wiki - Listenarchive