Chỉ số mà bạn mô tả là khá vô nghĩa. Chỉ mục được sử dụng tốt nhất khi bạn cần chọn một nhỏ số hàng so với tổng số hàng.
Lý do cho điều này là liên quan đến cách cơ sở dữ liệu truy cập một bảng. Các bảng có thể được đánh giá bằng cách quét toàn bộ bảng, trong đó mỗi khối được đọc và xử lý lần lượt. Hoặc bằng cách tìm kiếm rowid hoặc key, trong đó cơ sở dữ liệu có key / rowid và đọc chính xác hàng mà nó yêu cầu.
Trong trường hợp bạn sử dụng mệnh đề where dựa trên khóa chính hoặc một chỉ mục duy nhất khác, ví dụ:where id = 1
, cơ sở dữ liệu có thể sử dụng chỉ mục để nhận tham chiếu chính xác đến nơi dữ liệu của hàng được lưu trữ. Điều này rõ ràng hiệu quả hơn việc quét toàn bộ bảng và xử lý từng khối.
Bây giờ quay lại ví dụ của bạn, bạn có mệnh đề where của where status = 'enabled'
, chỉ mục sẽ trả về 150m hàng và cơ sở dữ liệu sẽ phải đọc lần lượt từng hàng bằng cách sử dụng các lần đọc nhỏ riêng biệt. Trong khi đó, việc truy cập bảng bằng cách quét toàn bộ bảng cho phép cơ sở dữ liệu sử dụng các lần đọc lớn hơn hiệu quả hơn.
Có một điểm mà tại đó tốt hơn là chỉ thực hiện quét toàn bộ bảng hơn là sử dụng chỉ mục. Với mysql, bạn có thể sử dụng FORCE INDEX (idx_name)
như một phần của truy vấn của bạn để cho phép so sánh giữa từng phương pháp truy cập bảng.
Tham khảo: http:// dev .mysql.com / doc / refman / 5.5 / vi / cach-to-tránh-table-scan.html