В този случай не можете да използвате индекс, тъй като използвате 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 проверка на всеки цикъл.