Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để lập chỉ mục một bảng liên kết cho kết nối nhiều-nhiều trong MySQL?

Nó phụ 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

thì 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ẽ dẫn đầu trong NESTED LOOPS và chỉ mục của bạn sẽ chỉ có thể sử dụng được 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

thì 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 các chỉ số độc lập ở đây. Chỉ mục tổng hợp có thể được sử dụng ở mọi nơi có thể sử dụng chỉ mục thuần túy 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 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ỉ mục trên cả hai cột.

Không bao giờ là xấu khi có một chỉ mục bổ sung cho trường 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)

Khóa chính 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ỉ mục bổ sung sẽ được sử dụng cho các tìm kiếm dựa trên giá trị của table_2 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có bất kỳ mức tăng hiệu suất nào trong việc lập chỉ mục một trường boolean không?

  2. Mysql FROM_UNIXTIME dưới dạng UTC

  3. Làm thế nào để thay đổi thư mục dữ liệu MySQL?

  4. PDO với CHÈN VÀO thông qua các báo cáo đã chuẩn bị

  5. Laravel 5 sử dụng điều kiện HOẶC với GIỮA