sql >> Databáze >  >> RDS >> Mysql

Jak správně indexovat propojovací tabulku pro připojení many-to-many v MySQL?

Záleží na způsobu vyhledávání.

Pokud budete hledat takto:

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

pak potřebujete:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

V tomto případě table1 bude vést v NESTED LOOPS a váš index bude použitelný pouze v případě, že table1 je indexován jako první.

Pokud budete hledat takto:

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

pak potřebujete:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)

z výše uvedených důvodů.

Zde nepotřebujete nezávislé indexy. Složený index lze použít všude tam, kde lze použít prostý index na prvním sloupci. Pokud používáte nezávislé indexy, nebudete moci efektivně vyhledávat obě hodnoty:

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

Pro dotaz, jako je tento, budete potřebovat alespoň jeden index v obou sloupcích.

Nikdy není špatné mít další index pro druhé pole:

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

Primární klíč bude použit pro hledání on both values a pro vyhledávání na základě hodnoty table_1 , další index bude použit pro vyhledávání na základě hodnoty table_2 .



  1. MySQL – různé metody, jak poznat aktuálního uživatele

  2. Velikost vzorku a doba trvání AKTUALIZACE STATISTIKY:Záleží na tom?

  3. PDO MySQL:Vložení více řádků do jednoho dotazu

  4. Chyba související s only_full_group_by při provádění dotazu v MySql