Зависит от того, как вы ищете.
Если вы ищете так:
/* 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
тогда вам нужно:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
В этом случае table1
будет ведущим в NESTED LOOPS
, и ваш индекс будет использоваться только тогда, когда table1
проиндексирован первым.
Если вы ищете так:
/* 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
тогда вам нужно:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
по вышеуказанным причинам.
Здесь вам не нужны независимые индексы. Составной индекс можно использовать везде, где можно использовать простой индекс в первом столбце. Если вы используете независимые индексы, вы не сможете эффективно искать оба значения:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
Для такого запроса вам понадобится хотя бы один индекс в обоих столбцах.
Никогда не плохо иметь дополнительный индекс для второго поля:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)
Первичный ключ будет использоваться для поиска on both values
, а для поиска по значению table_1
дополнительный индекс будет использоваться для поиска по значению table_2
.