Ik heb een query welke te traag draait (4 - 8 seconden).
Even kort wat de query doet:
Ik heb de volgende tabellen:
calendarnew: bevat alle events
Kolommen: calendarId, label, recur, until, enabled
calendareventsnew: bevat alle datums van de events (een event kan meerdere datums hebben)
Kolommen: eventId, calendarId, starttime, endtime
gm_markers: bevat alle locaties
Kolommen: pageId, lat, lng, label
Ik wil nu een lijst van alle events hebben, waarbij de kolom 'starttime' de datum geeft van de eerst volgende event, als er geen events in de toekomst zijn, geef dan de laatste datum. Met andere woorden: geeft de datum die het dichts bij 'nu' ligt
De query:
Ik heb indexen staan op:
calendareventsnew: eventId, calendarId,[calendarId, starttime], starttime
calendarnew: calendarId, locationId, enabled
Iemand een idee hoe ik dit beter kan oplossen? Volgens mij heb ik de indexen al op de juiste plaats staan.
Even kort wat de query doet:
Ik heb de volgende tabellen:
calendarnew: bevat alle events
Kolommen: calendarId, label, recur, until, enabled
calendareventsnew: bevat alle datums van de events (een event kan meerdere datums hebben)
Kolommen: eventId, calendarId, starttime, endtime
gm_markers: bevat alle locaties
Kolommen: pageId, lat, lng, label
Ik wil nu een lijst van alle events hebben, waarbij de kolom 'starttime' de datum geeft van de eerst volgende event, als er geen events in de toekomst zijn, geef dan de laatste datum. Met andere woorden: geeft de datum die het dichts bij 'nu' ligt
De 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 cn.*, gmm.label as `location`, UNIX_TIMESTAMP(cn.modificationdate) as `modificationdate`, UNIX_TIMESTAMP(cn.creationdate) as `creationdate`, UNIX_TIMESTAMP(cn.until) as `until`, UNIX_TIMESTAMP(cee.starttime) as `starttime`, UNIX_TIMESTAMP(cee.endtime) as `endtime`, FROM `calendarnew` cn LEFT JOIN `gm_markers` gmm ON cn.locationId = gmm.pageId LEFT JOIN calendareventsnew cee ON cee.eventId=IFNULL((SELECT eventId FROM calendareventsnew WHERE `calendarId`=cn.calendarId AND starttime > NOW() ORDER BY abs(NOW() - starttime) LIMIT 1), (SELECT eventId FROM calendareventsnew WHERE `calendarId`=cn.calendarId ORDER BY abs(NOW() - starttime) LIMIT 1)) GROUP BY calendarId ORDER BY enabled ASC LIMIT 0,80 |
Ik heb indexen staan op:
calendareventsnew: eventId, calendarId,[calendarId, starttime], starttime
calendarnew: calendarId, locationId, enabled
Iemand een idee hoe ik dit beter kan oplossen? Volgens mij heb ik de indexen al op de juiste plaats staan.
Raar... Is zo gek nog niet