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 1Mặc dù chỉ có
3cá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 1Không có chỉ mục, một
filesortsẽ đượ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 tshirtsMySQLsẽ sử dụngINDEX FOR GROUP-BYvà 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.