W tym przypadku nie możesz użyć indeksu, ponieważ używasz RANGE warunek filtrowania.
Jeśli chcesz użyć czegoś takiego jak:
SELECT *
FROM values_table this_
WHERE this_.value1 = @value
ORDER BY
value2
LIMIT 10
, a następnie tworzenie indeksu złożonego na (VALUE1, VALUE2) będzie używany zarówno do filtrowania, jak i do zamawiania.
Ale używasz warunku odległościowego, dlatego i tak musisz wykonać zamówienie.
Twój złożony indeks będzie wyglądał tak:
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
, a jeśli wybierzesz 1 i 2 w value1 , nadal nie otrzymujesz całego posortowanego zestawu value2 .
Jeśli Twój indeks na value2 nie jest bardzo selektywny (tzn. nie ma wielu DISTINCT value2 w tabeli), możesz spróbować:
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
Nazywa się to SKIP SCAN metoda dostępu. MySQL nie obsługuje go bezpośrednio, ale można go emulować w ten sposób.
RANGE w tym przypadku zostanie użyty dostęp, ale prawdopodobnie nie uzyskasz żadnej korzyści w zakresie wydajności, chyba że DISTINCT value2 zawierać mniej niż około 1% rzędów.
Użycie notatek:
m.value2 >= q.value2
AND m.value2 <= q.value2
zamiast
m.value2 = q.value2
To sprawia, że MySQL wykonaj RANGE sprawdzanie każdej pętli.