Mysql
 sql >> база данни >  >> RDS >> Mysql

Как правилно да индексирате таблица за свързване за връзка много към много в MySQL?

Зависи как търсите.

Ако търсите така:

/* 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

тогава имате нужда от:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

В този случай table1 ще бъде водеща в NESTED LOOPS и вашият индекс ще може да се използва само когато table1 първо се индексира.

Ако търсите така:

/* 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

тогава имате нужда от:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)

поради горепосочените причини.

Тук нямате нужда от независими индекси. Съставен индекс може да се използва навсякъде, където може да се използва обикновен индекс на първата колона. Ако използвате независими индекси, няма да можете да търсите ефективно и за двете стойности:

/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
  AND table_2 = @id2

За заявка като тази ще ви е необходим поне един индекс на двете колони.

Никога не е лошо да имате допълнителен индекс за второто поле:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)

Първичният ключ ще се използва за търсене on both values и за търсения въз основа на стойност на table_1 , допълнителен индекс ще се използва за търсения въз основа на стойността на 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. SQLite и поръчка по поръчка по

  2. Предотвратяване на кеширане на заявки в MySQL

  3. Как да инсталирате и конфигурирате MySQL в Ubuntu

  4. MySQL Резултати като списък, разделен със запетая

  5. Екраниращи символи като $ и % | MySQL и PHP