Det afhænger af, hvordan du søger.
Hvis du søger sådan her:
/* 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
så skal du bruge:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
I dette tilfælde table1
vil føre i NESTED LOOPS
og dit indeks vil kun være brugbart, når table1
indekseres først.
Hvis du søger sådan her:
/* 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
så skal du bruge:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
af årsagerne ovenfor.
Du behøver ikke uafhængige indekser her. Et sammensat indeks kan bruges overalt, hvor et almindeligt indeks på den første kolonne kan bruges. Hvis du bruger uafhængige indekser, vil du ikke være i stand til at søge effektivt efter begge værdier:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
For en forespørgsel som denne skal du have mindst ét indeks på begge kolonner.
Det er aldrig dårligt at have et ekstra indeks for det andet felt:
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ær nøgle vil blive brugt til søgninger on both values
og for søgninger baseret på værdien af table_1
, vil yderligere indeks blive brugt til søgninger baseret på værdien af table_2
.