Beste Tweakers,
Ik heb een query die er veel te lang over doet om de gegevens op te halen. De betreffende query:
De join met t2 is het probleem geval. Wanneer je deze weghaalt uit de query gaat alles goed en werkt deze op normale snelheid. Op t1.websiteid ligt een index net als op t2.websiteid. Ik denk dat het probleem te maken heeft met het leggen van een juiste index of het iets omschrijven van de query. Wanneer ik deze query uitbreid met een where statement waarin ik filter op websiteid dan wordt de index op t1.websiteid aangeroepen en is de query super snel.
Een explain van de query geeft:
Zoals je ziet loopt hij alle records van t2 na terwijl ik dat erg vreemd vind. Hij zou toch eerst gewoon de laatste 5 records van t1 moeten ophalen en daarna joinen met die resultaten die hij gevonden heeft?
Wanneer ik op wat voor manier een index wil laten gebruiken (met use of force index in de query) heeft dat geen resultaat. Iemand een idee waarom deze query zo langzaam is of wat ik kan veranderen om met één statement toch sneller dezelfde informatie op te halen?
Ik heb een query die er veel te lang over doet om de gegevens op te halen. De betreffende query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| SELECT SQL_CALC_FOUND_ROWS t1.storyid, t1.subject, t1.addeddate, t1.content, t1.location, DATE_FORMAT(t1.addeddate, "%d %b %Y %H:%i") AS onlinedatetime, t2.name AS sitename, t2.country AS sitecountry, t2.websiteid, t2.text, cc.cnn AS country, cc.ci AS countryid FROM t1 JOIN t2 ON t1.websiteid = t2.websiteid LEFT JOIN cc ON cc.ci = t1.countryid WHERE t1.autosave = 0 AND LENGTH(t2.password) = 0 LIMIT 5 |
De join met t2 is het probleem geval. Wanneer je deze weghaalt uit de query gaat alles goed en werkt deze op normale snelheid. Op t1.websiteid ligt een index net als op t2.websiteid. Ik denk dat het probleem te maken heeft met het leggen van een juiste index of het iets omschrijven van de query. Wanneer ik deze query uitbreid met een where statement waarin ik filter op websiteid dan wordt de index op t1.websiteid aangeroepen en is de query super snel.
Een explain van de query geeft:
code:
1
2
3
| 1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 4744 Using where 1 SIMPLE t1 ref websiteid websiteid 5 t2.websiteid 16 Using where 1 SIMPLE cc eq_ref PRIMARY PRIMARY 1 t1.countryid 1 |
Zoals je ziet loopt hij alle records van t2 na terwijl ik dat erg vreemd vind. Hij zou toch eerst gewoon de laatste 5 records van t1 moeten ophalen en daarna joinen met die resultaten die hij gevonden heeft?
Wanneer ik op wat voor manier een index wil laten gebruiken (met use of force index in de query) heeft dat geen resultaat. Iemand een idee waarom deze query zo langzaam is of wat ik kan veranderen om met één statement toch sneller dezelfde informatie op te halen?