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.