Chỉ mục bao trùm không giống với chỉ mục tổng hợp.
Nếu tôi có 2 chỉ mục riêng biệt, một trên col3 và một trên col4, thì cái nào trong số chúng sẽ được sử dụng trong truy vấn này?
Chỉ mục có tính phân biệt cao nhất.
MySQL lưu giữ thống kê về chỉ mục nào có thuộc tính nào.
Chỉ mục có sức mạnh phân biệt nhất (như rõ ràng trong thống kê của MySQL) sẽ được sử dụng.
Tôi đọc ở đâu đó rằng mỗi bảng trong truy vấn chỉ có một chỉ mục được sử dụng. Điều đó có nghĩa là không có cách nào để truy vấn sử dụng cả hai chỉ mục?
Bạn có thể sử dụng một lựa chọn con.
Hoặc tốt hơn nữa là sử dụng một chỉ mục kết hợp bao gồm cả col3 và col4.
Thứ hai, Nếu tôi tạo chỉ mục tổng hợp bằng cách sử dụng cả col3 và col4 cùng nhau nhưng chỉ sử dụng col3 trong mệnh đề WHERE thì điều đó sẽ kém hơn đối với hiệu suất? ví dụ:
Chỉ mục tổng hợp
Thuật ngữ chính xác là compound
chỉ mục, không phải tổng hợp.
Chỉ ngoài cùng bên trái một phần của chỉ mục kết hợp sẽ được sử dụng.
Vì vậy, nếu chỉ mục được xác định là
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
Xem: http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html
Lưu ý rằng nếu bạn chọn trường ngoài cùng bên trái, bạn có thể tránh sử dụng phần đó của chỉ mục trong mệnh đề where của bạn.
Hãy tưởng tượng chúng ta có một chỉ mục ghép
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
Lý do điều này hoạt động là vì truy vấn đầu tiên sử dụng chỉ mục bao trùm và thực hiện quét trên đó.
Truy vấn thứ hai cần truy cập vào bảng và vì lý do đó, việc quét mặc dù chỉ mục không có ý nghĩa.
Điều này chỉ hoạt động trong InnoDB.
Chỉ mục bao trùm là gì
Chỉ mục bao hàm đề cập đến trường hợp tất cả các trường được chọn trong truy vấn đều covered
bởi một chỉ mục, trong trường hợp đó, InnoDB (không phải MyISAM) sẽ không bao giờ đọc dữ liệu trong bảng, mà chỉ sử dụng dữ liệu trong chỉ mục, tăng tốc đáng kể cho việc chọn.
Lưu ý rằng trong InnoDB, khóa chính được bao gồm trong tất cả các chỉ mục phụ, vì vậy theo một cách nào đó, tất cả các chỉ mục phụ đều là chỉ mục ghép.
Điều này có nghĩa là nếu bạn chạy truy vấn sau trên InnoDB:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL sẽ luôn sử dụng chỉ mục bao trùm và sẽ không truy cập vào bảng thực tế. Mặc dù nó có thể sử dụng một chỉ mục bao trùm, nó sẽ thích PRIMARY KEY
bởi vì nó chỉ cần đạt một hàng duy nhất.