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