Một chỉ mục có thể hữu ích ngay cả trên các trường số lượng thấp nếu:
-
Khi một trong các giá trị có thể có rất ít so với các giá trị khác và bạn tìm kiếm nó.
Ví dụ:có rất ít phụ nữ mù màu, vì vậy truy vấn này:
SELECT * FROM color_blind_people WHERE gender = 'F'
có lẽ sẽ được hưởng lợi nhiều nhất từ chỉ mục về
gender
. -
Khi các giá trị có xu hướng được nhóm lại theo thứ tự bảng:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Mặc dù chỉ có
3
các năm khác biệt ở đây, các bản ghi có các năm trước hầu hết được thêm vào đầu tiên nên rất nhiều bản ghi sẽ phải được quét trước khi trả về2010
đầu tiên ghi lại nếu không có chỉ mục. -
Khi bạn cần
ORDER BY / LIMIT
:SELECT * FROM people ORDER BY gender, id LIMIT 1
Không có chỉ mục, một
filesort
sẽ được yêu cầu. Mặc dù nó được tối ưu hóa phần nào choLIMIT
, nó vẫn cần quét toàn bộ bảng. -
Khi chỉ mục bao gồm tất cả các trường được sử dụng trong truy vấn:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
Khi bạn cần
DISTINCT
:SELECT DISTINCT color FROM tshirts
MySQL
sẽ sử dụngINDEX FOR GROUP-BY
và nếu bạn có ít màu, truy vấn này sẽ nhanh chóng ngay cả với hàng triệu bản ghi.Đây là một ví dụ về trường hợp khi chỉ mục trên trường số lượng thấp là nhiều hơn hiệu quả hơn so với trường có bản số cao.
Lưu ý rằng nếu DML
hiệu suất không ảnh hưởng nhiều đến vấn đề, thì việc tạo chỉ mục sẽ an toàn.
Nếu trình tối ưu hóa cho rằng chỉ mục không hiệu quả, chỉ mục sẽ không được sử dụng.