Bạn không thể sử dụng chỉ mục trong trường hợp này, vì bạn sử dụng RANGE điều kiện lọc.
Nếu bạn sử dụng một cái gì đó như:
SELECT *
FROM values_table this_
WHERE this_.value1 = @value
ORDER BY
value2
LIMIT 10
, sau đó tạo chỉ mục tổng hợp trên (VALUE1, VALUE2) sẽ được sử dụng cả để lọc và đặt hàng.
Nhưng bạn sử dụng một điều kiện phạm vi, đó là lý do tại sao bạn vẫn cần phải thực hiện đặt hàng.
Chỉ mục tổng hợp của bạn sẽ giống như sau:
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
và nếu bạn chọn 1 và 2 trong value1 , bạn vẫn không nhận được toàn bộ tập hợp value2 được sắp xếp .
Nếu chỉ mục của bạn trên value2 không có tính chọn lọc cao (tức là không có nhiều DISTINCT value2 trong bảng), bạn có thể thử:
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
Đây được gọi là SKIP SCAN phương thức truy cập. MySQL không hỗ trợ nó trực tiếp, nhưng nó có thể được mô phỏng như thế này.
RANGE quyền truy cập sẽ được sử dụng trong trường hợp này, nhưng có thể bạn sẽ không nhận được bất kỳ lợi ích hiệu suất nào trừ khi DISTINCT value2 bao gồm ít hơn khoảng 1% trong số các hàng.
Lưu ý việc sử dụng:
m.value2 >= q.value2
AND m.value2 <= q.value2
thay vì
m.value2 = q.value2
Điều này làm cho MySQL thực hiện RANGE kiểm tra từng vòng lặp.