To zależy od tego, jak szukasz.
Jeśli szukasz w ten sposób:
/* 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
wtedy potrzebujesz:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
W tym przypadku table1
będzie prowadzić w NESTED LOOPS
a twój indeks będzie użyteczny tylko wtedy, gdy table1
jest indeksowany jako pierwszy.
Jeśli szukasz w ten sposób:
/* 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
wtedy potrzebujesz:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
z powyższych powodów.
Nie potrzebujesz tutaj niezależnych indeksów. Indeks złożony może być używany wszędzie tam, gdzie można użyć zwykłego indeksu w pierwszej kolumnie. Jeśli użyjesz niezależnych indeksów, nie będziesz w stanie efektywnie wyszukiwać obu wartości:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
W przypadku takiego zapytania potrzebujesz co najmniej jednego indeksu w obu kolumnach.
Posiadanie dodatkowego indeksu dla drugiego pola nigdy nie jest złe:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)
Klucz podstawowy będzie używany do wyszukiwania on both values
oraz dla wyszukiwań opartych na wartości table_1
, dodatkowy indeks zostanie użyty do wyszukiwania na podstawie wartości table_2
.