这取决于您的搜索方式。
如果你这样搜索:
/* 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 值的搜索。