Tùy thuộc vào cách bạn tìm kiếm.
Nếu bạn tìm kiếm như thế này:
/* Given a value from table1, find all related values from table2 */
SELECT *
FROM table1 t1
JOIN table_table tt ON (tt.table_1 = t1.id)
JOIN table2 t2 ON (t2.id = tt.table_2)
WHERE t1.id = @id
sau đó bạn cần:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
Trong trường hợp này, table1
sẽ được dẫn trong NESTED LOOPS
và chỉ số của bạn sẽ được sử dụng chỉ khi table1
được lập chỉ mục đầu tiên .
Nếu bạn tìm kiếm như thế này:
/* Given a value from table2, find all related values from table1 */
SELECT *
FROM table2 t2
JOIN table_table tt ON (tt.table_2 = t2.id)
JOIN table1 t1 ON (t1.id = tt.table_1)
WHERE t2.id = @id
sau đó bạn cần:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
vì những lý do trên.
Bạn không cần chỉ số độc lập ở đây. Chỉ số tổng hợp có thể được sử dụng ở mọi nơi có thể sử dụng chỉ mục đơn giản trên cột đầu tiên. Nếu bạn sử dụng các chỉ số độc lập, bạn sẽ không thể tìm kiếm một cách hiệu quả cho cả hai giá trị:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
Đối với một truy vấn như thế này, bạn sẽ cần ít nhất một chỉ số trên cả hai cột.
Không bao giờ là xấu để có một chỉ số bổ sung cho lĩnh vực thứ hai:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)
Tiểu học trọng điểm sẽ được sử dụng cho các tìm kiếm on both values
và cho các tìm kiếm dựa trên giá trị của table_1
, chỉ số bổ sung sẽ được sử dụng cho các tìm kiếm dựa trên giá trị của table_2
.
Cảm ơn câu trả lời chi tiết, nhưng nếu tôi tìm kiếm cả hai cách thì sao? Ngoài ra tôi đang sử dụng Hibernate vì vậy tôi thậm chí không chắc chắn cách mà nó được sử dụng. – serg
Nếu bạn tìm kiếm cả hai cách, bạn sẽ cần HAI chỉ mục: một tổng hợp cho khóa CHÍNH và một đồng bằng cho cột thứ hai trong khóa CHÍNH. Nó ở cuối bài viết của tôi. – Quassnoi
Cảm ơn câu trả lời tuyệt vời cho chi tiết –