2012-06-12 22 views
7

Hãy xem xét hai sau đây giải thích:Không có chỉ mục nào trên! =?

EXPLAIN SELECT * FROM sales WHERE title != 'The' 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ALL  title  NULL NULL NULL 41707 Using where 

Và -

EXPLAIN SELECT * FROM sales WHERE title = 'The' 
id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ref  title   title 767 const 1 Using where 

Tại sao truy vấn != có một chìa khóa NULL? Tại sao nó không sử dụng title? Điều gì gây ra tuyên bố = để có thể sử dụng chỉ mục chứ không phải là !=?

Trả lời

11

Không có điểm nào khi sử dụng chỉ mục trừ khi title chính xác là 'The' rất thường xuyên.

Vì gần như mọi hàng cần phải được chọn, bạn không đạt được bất kỳ thứ gì từ việc sử dụng chỉ mục. Nó thực sự có thể tốn kém để sử dụng một chỉ mục, mà có lẽ là những gì công cụ MySQL của bạn đang xác định, do đó, nó được chọn không sử dụng chỉ mục.

Hãy so sánh khối lượng công việc thực hiện trong hai tình huống này:

Sử dụng chỉ số:

1) Đọc toàn bộ cây index vào bộ nhớ.
2) Tìm kiếm cây chỉ mục cho giá trị 'The' và lọc ra các mục nhập đó.
3) Đọc mọi hàng ngoại trừ vài ngoại lệ (có thể nằm trong cùng một khối trên đĩa như các hàng cần đọc, vì vậy thực sự toàn bộ bảng có khả năng được đọc trong) từ bảng vào bộ nhớ.

Nếu không có chỉ số:

1) đọc mỗi hàng vào bộ nhớ và khi đọc họ lọc ra bất kỳ nơi title = 'The' từ kết quả thiết

+1

Để mở rộng trên đó - chọn mỗi hàng mà tiêu đề không phải là "The" sẽ trả về hầu hết mọi hàng trong bảng, vì vậy không có điểm nào trong việc sử dụng chỉ mục cho truy vấn này chút nào. (Vì bạn sẽ phải quét toàn bộ bảng để trả lại tất cả các hàng đó.) – duskwuff

Các vấn đề liên quan