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
.