2012-08-31 31 views
29

Hãy tưởng tượng một bảng có nhiều cột, ví dụ: id, a, b, c, d, e. Tuy nhiên, tôi thường chọn theo số id, có nhiều truy vấn trong ứng dụng khách sử dụng các điều kiện khác nhau trên tập hợp con của các cột.MySQL có thể sử dụng nhiều chỉ mục cho một truy vấn không?

Khi MySQL thực hiện truy vấn trên một bảng có nhiều điều kiện WHERE trên nhiều cột, có thể thực sự sử dụng các chỉ mục được tạo trên các cột khác nhau không? Hoặc cách duy nhất để làm cho nó nhanh là tạo các chỉ mục đa cột cho tất cả các truy vấn có thể?

+0

Bạn có ví dụ về truy vấn cho chúng tôi không? – ZombieCode

+6

@Ekaterina, привет :) Câu hỏi bao gồm một câu hỏi chung hấp dẫn để thực hành và kinh nghiệm, tôi chắc chắn không có truy vấn cụ thể là cần thiết ở đây. Tuy nhiên tôi có thể nghĩ ra một ví dụ nếu điều đó có ý nghĩa – kolypto

Trả lời

47

Có, MySQL có thể sử dụng nhiều chỉ mục cho một truy vấn. Trình tối ưu hóa sẽ xác định các chỉ mục nào sẽ có lợi cho truy vấn. Bạn có thể sử dụng EXPLAIN để lấy thông tin về cách MySQL thực hiện một câu lệnh. Bạn có thể thêm hoặc bỏ qua chỉ số sử dụng gợi ý như vậy:

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a; 

tôi sẽ khuyên bạn nên đọc lên trên how MySQL uses indexes.

Chỉ cần một vài trích đoạn:

Nếu có một sự lựa chọn giữa nhiều chỉ số, MySQL thường sử dụng chỉ số đó tìm số nhỏ nhất của dãy.

Nếu chỉ mục nhiều cột tồn tại trên col1 và col2, thì có thể tìm nạp trực tiếp các hàng thích hợp . Nếu chỉ mục một cột riêng biệt tồn tại trên col1 và col2, trình tối ưu hóa sẽ cố gắng sử dụng tính năng tối ưu hóa chỉ mục (xem Mục 8.3.1.4, "Tối ưu hóa chỉ mục") hoặc tìm cách chỉ mục hạn chế nhất bằng cách quyết định chỉ số tìm ít hàng hơn và sử dụng chỉ mục đó để tìm nạp các hàng.

+2

Wow đó là một cái gì đó mới hoặc tôi quản lý để bỏ lỡ điều đó trong tài liệu. Cảm ơn bạn, đó là thú vị :) Dù sao, một chỉ số đa cột cho các trường hợp cụ thể sẽ được nhiều hơn nữa performant. – kolypto

15

Cổ điển, MySQL có thể sử dụng một chỉ mục cho mỗi tham chiếu bảng trong một truy vấn nhất định. Tuy nhiên, trong các phiên bản gần đây của MySQL, một hoạt động được gọi là index merge có thể diễn ra và cho phép MySQL sử dụng nhiều hơn một chỉ mục cho mỗi bảng.

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

+3

Tôi nghĩ bạn nên chỉnh sửa điều đó thành: * "có thể sử dụng một chỉ mục cho mỗi bảng ** tham chiếu **" * –

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