Toon posts:

[MySQL] Filesort op simple select type

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:
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?

Verwijderd

Topicstarter
Het probleem is opgelost. Voor de knowledge base zal ik maar even uitleggen wat het punt is.

Per query kan MySQL blijkbaar slechts 1 INDEX per tabel gebruiken. Daarom werd bij het ophalen van de rijen in de WHERE clause al de blueprint_competition_id INDEX gebruikt. Voor het sorteren kon diezelfde INDEX niet meer gebruikt worden aangezien het een ander kolom betreft. Door gebruik te maken van een samengestelde INDEX is dit probleem op te lossen.