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.