Dit is een beetje moeilijk uit te leggen.
De query die de index gebruikt, gebruikt deze omdat de index een "bedekkende" index is. Dat wil zeggen, alle kolommen in de index bevinden zich in de query. Het enige deel van de index dat echt effectief wordt gebruikt, is de voorwaarde op latitude
.
Normaal gesproken zou een dekkingsindex slechts . hebben de kolommen die in de query worden genoemd. De primaire sleutel wordt echter gebruikt om naar de records te verwijzen, dus ik vermoed dat users.Id
is de primaire sleutel op tafel. En de index wordt gescand op geldige waarden van latitude
.
De query die de index niet gebruikt, gebruikt deze om twee redenen niet. Ten eerste zijn de voorwaarden op de kolommen ongelijkheden. Een index zoeken kan alleen gelijkheidsvoorwaarden en één ongelijkheid gebruiken. Dat betekent dat de index alleen kan worden gebruikt voor latitude
op de meest effectieve manier. Ten tweede moeten de extra kolommen in de zoekopdracht toch naar de gegevenspagina gaan.
Met andere woorden, de optimizer zegt in feite:"Waarom zou ik de moeite nemen om naar de index te gaan om door de index te bladeren en vervolgens de gegevenspagina's te scannen? In plaats daarvan kan ik gewoon de gegevenspagina's scannen en alles in één keer krijgen."
Uw volgende vraag is ongetwijfeld:"Maar hoe maak ik mijn query sneller?" Mijn suggestie zou zijn om ruimtelijke indexen .