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.