sql >> Database >  >> RDS >> Mysql

Hoe een koppelingstabel correct te indexeren voor veel-op-veel-verbindingen in MySQL?

Het hangt af van hoe je zoekt.

Als je als volgt zoekt:

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

dan heb je nodig:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

In dit geval table1 zal leidend zijn in NESTED LOOPS en uw index is alleen bruikbaar als table1 wordt eerst geïndexeerd.

Als je als volgt zoekt:

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

dan heb je nodig:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)

om de bovenstaande redenen.

U hebt hier geen onafhankelijke indices nodig. Een samengestelde index kan overal worden gebruikt waar een gewone index op de eerste kolom kan worden gebruikt. Als u onafhankelijke indices gebruikt, kunt u niet efficiënt naar beide waarden zoeken:

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

Voor een zoekopdracht als deze heeft u op beide kolommen minimaal één index nodig.

Het is nooit slecht om een ​​extra index te hebben voor het tweede veld:

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

Primaire sleutel wordt gebruikt voor zoekopdrachten on both values en voor zoekopdrachten op basis van de waarde van table_1 , er wordt een extra index gebruikt voor zoekopdrachten op basis van de waarde van table_2 .



  1. OSX ld:bibliotheek niet gevonden voor -lssl

  2. Dagen aftrekken van een datum in PostgreSQL

  3. Postgres-queryoptimalisatie (een indexscan afdwingen)

  4. BESTEL OP DATUM met eerst NULLS en vervolgens de meest recente datums