Du kan ikke bruge et indeks i dette tilfælde, da du bruger en RANGE filtreringstilstand.
Hvis du vil bruge noget som:
SELECT *
FROM values_table this_
WHERE this_.value1 = @value
ORDER BY
value2
LIMIT 10
, og opret derefter et sammensat indeks på (VALUE1, VALUE2) ville blive brugt både til filtrering og til bestilling.
Men du bruger en rækkeviddetilstand, og det er derfor, du bliver nødt til at udføre bestilling alligevel.
Dit sammensatte indeks vil se sådan ud:
value1 value2 ----- ------ 1 10 1 20 1 30 1 40 1 50 1 60 2 10 2 20 2 30 3 10 3 20 3 30 3 40
, og hvis du vælger 1 og 2 i value1 , får du stadig ikke et helt sorteret sæt af value2 .
Hvis dit indeks på value2 er ikke særlig selektiv (dvs. der er ikke mange DISTINCT value2). i tabellen), kan du prøve:
CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)
/* Note the order, it's important */
SELECT *
FROM (
SELECT DISTINCT value2
FROM mytable
ORDER BY
value2
) q,
mytable m
WHERE m.value2 >= q.value2
AND m.value2 <= q.value2
AND m.value1 BETWEEN 13123123 AND 123123123
Dette kaldes en SKIP SCAN adgangsmetode. MySQL understøtter det ikke direkte, men det kan emuleres på denne måde.
RANGE adgang vil blive brugt i dette tilfælde, men sandsynligvis vil du ikke få nogen ydeevnefordel, medmindre DISTINCT value2 omfatter mindre end ca. 1% rækker.
Bemærk brugen af:
m.value2 >= q.value2
AND m.value2 <= q.value2
i stedet for
m.value2 = q.value2
Dette gør MySQL udfør RANGE kontrol af hver sløjfe.