В този случай не можете да използвате индекс, тъй като използвате RANGE
състояние на филтриране.
Ако използвате нещо като:
SELECT *
FROM values_table this_
WHERE this_.value1 = @value
ORDER BY
value2
LIMIT 10
, след което създаване на съставен индекс на (VALUE1, VALUE2)
ще се използва както за филтриране, така и за подреждане.
Но вие използвате условие с диапазон, затова все пак ще трябва да извършите поръчка.
Вашият съставен индекс ще изглежда така:
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
и ако изберете 1
и 2
в value1
, все още не получавате цял сортиран набор от value2
.
Ако вашият индекс на value2
не е много селективен (т.е. няма много DISTINCT value2
в таблицата), можете да опитате:
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
Това се нарича SKIP SCAN
метод за достъп. MySQL
не го поддържа директно, но може да се емулира по този начин.
RANGE
достъпът ще бъде използван в този случай, но вероятно няма да получите полза от производителността, освен ако DISTINCT value2
съдържат по-малко от около 1%
от редове.
Обърнете внимание на използването на:
m.value2 >= q.value2
AND m.value2 <= q.value2
вместо
m.value2 = q.value2
Това прави MySQL
изпълнява RANGE
проверка на всеки цикъл.