Trong một nhiều-nhiều bố trí điển hình như thế này ...Làm cách nào để lập chỉ mục đúng bảng liên kết nhiều-nhiều?
Movies Actors Movies_Actors ------ ------ ------------- movie_ID actor_ID FK_movie_ID title name FK_actor_ID
... làm thế nào nên bảng hiệp hội ('Movies_Actors'
) được lập chỉ mục cho tốc độ đọc tối ưu?
Tôi thường thấy điều này chỉ thực hiện với các khóa chính tổng hợp trong bảng hiệp hội, như vậy:
CREATE TABLE Movies_Actors (
FK_movie_ID INTEGER,
FK_actor_ID INTEGER,
PRIMARY KEY (FK_movie_ID, FK_actor_ID)
)
Tuy nhiên, điều này có vẻ như chỉ số sẽ chỉ có ích khi tìm kiếm cảmovie_ID
và actor_ID
(mặc dù tôi không chắc chắn về việc liệu một chỉ mục tổng hợp cũng hoạt động cho các cột riêng lẻ).
Vì cả hai "diễn viên nào trong Phim X" và "phim có diễn viên Y trong" sẽ là truy vấn phổ biến cho bảng này, có vẻ như có một chỉ mục riêng lẻ trên mỗi cột để nhanh chóng xác định vị trí diễn viên và phim của riêng họ. Chỉ số tổng hợp có thực hiện được điều này không? Nếu không, có một chỉ số tổng hợp có vẻ vô nghĩa trên bảng này. Và nếu một chỉ số tổng hợp là vô nghĩa, phải làm gì về một khóa chính? Khóa ứng cử viên rõ ràng là tổng hợp của hai cột, nhưng nếu chỉ số tổng hợp kết quả là vô nghĩa (nó không được?) Nó có vẻ như một sự lãng phí.
Ngoài ra, this link thêm một số nhầm lẫn và chỉ ra rằng nó thậm chí có thể có ích để thực sự xác định hai chỉ số hỗn hợp ... một trong số họ như (FK_movie_ID, FK_actor_ID)
, và người kia ngược lại như (FK_actor_ID, FK_movie_ID)
, với sự lựa chọn trong số đó là khóa chính (và do đó thường được nhóm lại) và đó là 'chỉ' một chỉ mục tổng hợp duy nhất được dựa trên hướng nào được truy vấn nhiều hơn.
Câu chuyện có thật là gì? Chỉ mục tổng hợp có tự động lập chỉ mục từng cột một cách hiệu quả để tìm kiếm trên một hay cột khác không? Bảng kết hợp tối ưu (trong tốc độ đọc, không kích thước) có chỉ số tổng hợp theo mỗi hướng và một trên mỗi cột không? Mechancs đằng sau hậu trường là gì?
EDIT: Tôi thấy câu hỏi có liên quan này rằng đối với một số lý do tôi không xác định vị trí trước khi gửi bài ... How to properly index a linking table for many-to-many connection in MySQL?
Câu hỏi rất thú vị, tôi chắc chắn nhiều người sai về nó. – luxcem