Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann man eine Verknüpfungstabelle für eine Viele-zu-Viele-Verbindung in MySQL richtig indizieren?

Es hängt davon ab, wie Sie suchen.

Wenn Sie so suchen:

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

dann brauchst du:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

In diesem Fall table1 wird in NESTED LOOPS führen und Ihr Index ist nur verwendbar, wenn table1 wird zuerst indiziert.

Wenn Sie so suchen:

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

dann brauchst du:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)

aus den oben genannten Gründen.

Sie brauchen hier keine unabhängigen Indizes. Ein zusammengesetzter Index kann überall dort verwendet werden, wo ein einfacher Index für die erste Spalte verwendet werden kann. Wenn Sie unabhängige Indizes verwenden, können Sie nicht effizient nach beiden Werten suchen:

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

Für eine Abfrage wie diese benötigen Sie mindestens einen Index für beide Spalten.

Es ist nie schlecht, einen zusätzlichen Index für das zweite Feld zu haben:

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

Der Primärschlüssel wird für die Suche nach on both values verwendet und für Suchen basierend auf dem Wert von table_1 , wird ein zusätzlicher Index für Suchen basierend auf dem Wert von table_2 verwendet .