2011-01-17 5 views
13

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_IDactor_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 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?

+0

Câu hỏi rất thú vị, tôi chắc chắn nhiều người sai về nó. – luxcem

Trả lời

9

(mặc dù tôi không chắc chắn về việc liệu chỉ mục tổng hợp cũng hoạt động cho các cột riêng lẻ ).

Có, có thể. Nhưng chỉ có tiền tố: http://use-the-index-luke.com/sql/where-clause/the-equals-operator/concatenated-keys

Ngoài ra, liên kết này cho biết thêm một số nhầm lẫn và chỉ ra rằng nó thậm chí có thể hữu ích để thực sự xác định hai chỉ số tổng hợp ...một trong số họ như (FK_movie_ID, FK_actor_ID), và khác ngược lại như (FK_actor_ID, FK_movie_ID),

Đó thực sự là điều cần làm.

Lấy một làm chỉ mục nhóm và chỉ mục không phân cụm mà sẽ bao gồm khóa chỉ mục nhóm - do đó không cần phải bao gồm cột đó nữa (thx đến JNK).

CREATE CLUSTERING INDEX a on Movies_Actors (fk_movie_id, fk_actor_id); 
CREATE NONCLUSTERING INDEX b on Movies_Actors (fk_actor_id); 

Câu chuyện có thật là gì?

http://Use-The-Index-Luke.com/ :)

Liệu một chỉ số tổng hợp tự động hiệu quả index mỗi cột cho tìm kiếm trên một hay khác?

Không. Chỉ tiền tố của chỉ mục. Nếu bạn có chỉ mục (a, b, c), truy vấn a =? và b =? có thể sử dụng chỉ mục. Tuy nhiên c =? không thể, cũng không thể b =? và c = ?.

nên tối ưu (về tốc độ đọc, không kích thước) Bảng hiệp hội có một chỉ số tổng hợp mỗi chiều và một trên mỗi cột?

Nếu bạn cần tham gia cả hai hướng, có ("chỉ mục tổng hợp theo từng hướng") và không ("một trên mỗi cột").

Cơ chế đằng sau hiện trường là gì?

Vâng, cùng một liên kết một lần nữa.

Phát biểu SQL Server, bạn cuối cùng cũng có thể xem xét chế độ xem được lập chỉ mục. Đó là loại trước khi tham gia. Hai chỉ mục, như trên, cũng có thể đủ nhanh.

+0

Câu trả lời hay, cảm ơn. Một điều: bạn chỉ ra rằng hai chỉ số tổng hợp với một chỉ số ngược lại là "điều cần làm", nhưng sau đó nói rằng điều này nên được thực hiện * và * có chỉ mục riêng lẻ trên mỗi cột "nếu bạn cần tham gia cả hai hướng". Đó là nó? Nếu cột đầu tiên trong chỉ mục có thể được sử dụng như thể cột được lập chỉ mục một mình, không phải là thêm các chỉ mục đơn trên mỗi cột một sự lãng phí thời gian? – Russ

+0

Ngoài ra - liên kết thú vị, cảm ơn! Có vẻ như có một số thông tin tốt ở đó. Việc thực hiện diễn đàn Q & A có vẻ quen thuộc ... – Russ

+0

@Russ - mơ hồ, chỉ có những người mất tích. Tôi đã chỉnh sửa câu trả lời ở trên, có vẻ như tôi đã bỏ lỡ phần "và một phần trên mỗi cột". –

2

Trong SQL Server, một chỉ số tổng hợp có thể được sử dụng cho một tìm kiếm lĩnh vực duy nhất cho chỉ cột đầu tiên. Điều đó có nghĩa là bạn cần có thêm một chỉ mục trường trên FK_actor_id nếu có tìm kiếm trên trường đó mà không có FK_Movie_id trong cùng một truy vấn.