2009-11-06 27 views
26

Các MySQL 5.4 documentation, on Optimizing Queries with EXPLAIN nói rằng đây về những nhận xét thêm:MySQL GIẢI THÍCH: "Sử dụng chỉ số" và "Sử dụng điều kiện chỉ số"

  • Sử dụng chỉ số

Thông tin cột được lấy từ bảng chỉ sử dụng thông tin trong cây chỉ mục mà không phải thực hiện một tìm kiếm bổ sung để đọc hàng thực tế . Chiến lược này có thể được sử dụng khi truy vấn chỉ sử dụng các cột là một phần của một chỉ mục duy nhất.

[...]

  • Sử dụng điều kiện chỉ số

Bàn được đọc bằng cách truy cập index tuples và thử nghiệm chúng đầu tiên xác định xem có nên đọc bảng đầy đủ hàng. Theo cách này, thông tin chỉ mục được sử dụng để trì hoãn (“đẩy xuống”) đọc hàng đầy đủ của bảng trừ khi nó là cần thiết.

Tôi có thiếu thứ gì đó hoặc làm hai điều này có cùng ý nghĩa (ví dụ: "không đọc hàng, chỉ mục đủ") không?

Trả lời

56

Một ví dụ giải thích nó tốt nhất:

SELECT Year, Make --- possibly more fields and/or from extra tables 
FROM myUsedCarInventory 
WHERE Make = 'Toyota' AND Year > '2006' 

Assuming the Available indexes are: 
    CarId 
    VIN 
    Make 
    Make and Year 

Truy vấn này sẽ giải thích với 'Sử dụng Index' bởi vì nó không cần, ở tất cả, để "nhấn" bảng myUsedCarInventory bản thân kể từ khi "Make và "Chỉ mục" bao gồm "nhu cầu của nó liên quan đến các yếu tố của mệnh đề WHERE liên quan đến bảng đó.

Bây giờ, hãy tưởng tượng, chúng tôi tiếp tục truy vấn như nhau, nhưng đối với việc bổ sung các điều kiện trên màu

... 
WHERE Make = 'Toyota' AND Year > '2006' AND Color = 'Red' 

Truy vấn này có khả năng sẽ giải thích với 'Sử dụng Index Điều kiện' (các 'khả năng', đây là trường hợp Toyota + năm sẽ không được ước tính đủ chọn lọc và trình tối ưu hóa có thể quyết định chỉ quét bảng). Điều này có nghĩa là MySQL sẽ FIRST sử dụng chỉ mục để giải quyết Make + Year và nó cũng phải tra cứu hàng tương ứng trong bảng, chỉ dành cho các hàng thỏa mãn điều kiện Make + Year. Đó là những gì đôi khi được gọi là "push down optimization".

+0

+1 Giải thích tốt – Andomar

+0

Tôi có đúng là giả sử rằng tôi cũng thấy "Sử dụng vị trí" trong ví dụ thứ hai của bạn không? – Piskvor

+0

@Piskvor Xin lỗi tôi không ở vị trí để kiểm tra điều này, tại thời điểm này, cả hai truy vấn sẽ hiển thị là "Sử dụng ở đâu", tôi nghĩ vậy. – mjv

6

Sự khác biệt là "Sử dụng chỉ mục" không cần tra cứu từ chỉ mục đến bảng, trong khi "Sử dụng điều kiện chỉ mục" đôi khi phải. Tôi sẽ cố gắng minh họa điều này với một ví dụ. Giả sử bạn có bảng này:

id, name, location 

Với một chỉ mục trên

name, id 

Sau đó truy vấn này không cần bảng cho bất cứ điều gì, nó có thể lấy tất cả đó là thông tin "Sử dụng chỉ số":

select id, name from table where name = 'Piskvor' 

Nhưng truy vấn này cần tra cứu bảng cho tất cả các hàng có tên bằng 'Piskvor', vì nó không thể truy xuất vị trí từ chỉ mục:

select id from table where name = 'Piskvor' and location = 'North Pole' 

Truy vấn vẫn có thể sử dụng chỉ mục để giới hạn kết quả cho các nhóm nhỏ hàng có tên cụ thể, nhưng phải xem xét các hàng đó trong bảng để kiểm tra xem vị trí có phù hợp không.

+2

"nó có thể truy xuất tất cả thông tin của nó Sử dụng chỉ mục" - nó có thể chỉ sử dụng cột thứ hai trong chỉ mục tổng hợp? Tôi nghĩ rằng đối với 'select id, name từ bảng mà name = 'Piskvor'' chỉ mục' (id, name) 'sẽ không được sử dụng, trái ngược với chỉ mục' (name, id) '. Ông có thể làm rõ? – Piskvor

+1

@Piskvor: Bạn nói đúng. Bạn vẫn có thể thực hiện quét chỉ mục (id, name) nhưng chỉ mục trên (name) sẽ cho phép chỉ mục tìm kiếm. Tôi sẽ chỉnh sửa câu trả lời. – Andomar

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