Vandaag ben ik begonnen me te verdiepen in de nuances van MySQL en de manieren om queries te optimaliseren. Nadat ik de documentatie van de EXPLAIN functie gelezen heb, ben ik aan de slag gegaan met het analyseren van een eenvoudige query en het viel me op dat voor het sorteren van de result set een filesort gebruikt wordt. Deze stap kan (in veel gevallen) vermeden worden door een index te zetten op de kolom. Nu helpt het zetten van een index op de desbetreffende kolom niet; er wordt nog steeds een filesort gebruikt.
Het gaat om de volgende query:
Name is een varchar met lengte 30 (heeft het feit dat het een varchar is te maken met de mogelijkheid van MySQL om de index te gebruiken bij het sorteren op die kolom?), blueprint_team_id is de PRIMARY KEY, blueprint_competition_id is een INDEX en ook name is een INDEX. Wanneer de WHERE clause weggehaald wordt, dan wordt er een INDEX sort gebruikt. Zit het probleem in het feit dat voor het selecteren van de rijen de blueprint_competition_id INDEX gebruikt wordt (niet zeker of deze bewering juist is), waardoor bij het sorteren de name INDEX niet meer gebruikt kan worden? Wanneer ik namelijk sorteer op blueprint_competition_id dan is de extra kolom van de explain aanroep leeg (Dit kan wellicht ook te maken hebben met het feit dat MySQL weet dat het sorteren van const kolom's in de WHERE clause niet nodig is). Kortom; kan iemand mij uitleggen wat het probleem is?
Kortom; kan iemand mij vertellen waarom bij deze query filesort gebruikt wordt in plaats van INDEX sort?
Het gaat om de volgende query:
SQL:
1
2
3
4
5
6
7
8
| SELECT name FROM blueprint_team WHERE blueprint_competition_id = 1 ORDER BY name DESC |
Name is een varchar met lengte 30 (heeft het feit dat het een varchar is te maken met de mogelijkheid van MySQL om de index te gebruiken bij het sorteren op die kolom?), blueprint_team_id is de PRIMARY KEY, blueprint_competition_id is een INDEX en ook name is een INDEX. Wanneer de WHERE clause weggehaald wordt, dan wordt er een INDEX sort gebruikt. Zit het probleem in het feit dat voor het selecteren van de rijen de blueprint_competition_id INDEX gebruikt wordt (niet zeker of deze bewering juist is), waardoor bij het sorteren de name INDEX niet meer gebruikt kan worden? Wanneer ik namelijk sorteer op blueprint_competition_id dan is de extra kolom van de explain aanroep leeg (Dit kan wellicht ook te maken hebben met het feit dat MySQL weet dat het sorteren van const kolom's in de WHERE clause niet nodig is). Kortom; kan iemand mij uitleggen wat het probleem is?
Kortom; kan iemand mij vertellen waarom bij deze query filesort gebruikt wordt in plaats van INDEX sort?