Om een grafiekje te plotten met omzet per maand gebruik ik deze query:
Het nadeel is alleen dat deze query ruim 15 seconden duurt. Als ik de GROUP BY regel weghaal dan duurt de query nog maar 0,015 seconden en levert 560.000 rijen op.
Uiteraard zit er een index op de kolom cp.created maar die wordt niet gebruikt omdat hij de PRIMARY KEY die op cp.clientpackageitem_id zit gebruikt.
Na wat Googlen kom ik al een aantal keer het antwoord "Summary tables" tegen. Nu ben ik daar in eerste instantie niet zo'n fan van omdat het een stuk meer aanpassingen in de applicatie vergt en ik twijfel of dat echt de beste oplossing is.
Waar zou ik nog naar kunnen kijken om de performance van de query te verbeteren?
SQL:
1
2
3
4
5
6
7
8
9
10
11
| BEGIN SELECT SUM(cpi.amount*cpi.billprice) AS 'total', MONTH(cp.created) as 'month', YEAR(cp.created) as 'year' FROM clientpackage cp INNER JOIN clientpackageitem cpi ON cp.clientpackage_id = cpi.clientpackage_id WHERE YEAR(cp.created) > YEAR(DATE_SUB(NOW(), INTERVAL 4 YEAR)) GROUP BY MONTH(cp.created), YEAR(cp.created); |
Het nadeel is alleen dat deze query ruim 15 seconden duurt. Als ik de GROUP BY regel weghaal dan duurt de query nog maar 0,015 seconden en levert 560.000 rijen op.
Uiteraard zit er een index op de kolom cp.created maar die wordt niet gebruikt omdat hij de PRIMARY KEY die op cp.clientpackageitem_id zit gebruikt.
Na wat Googlen kom ik al een aantal keer het antwoord "Summary tables" tegen. Nu ben ik daar in eerste instantie niet zo'n fan van omdat het een stuk meer aanpassingen in de applicatie vergt en ik twijfel of dat echt de beste oplossing is.
Waar zou ik nog naar kunnen kijken om de performance van de query te verbeteren?
[ Voor 7% gewijzigd door RickyHeijnen op 04-01-2019 14:33 ]