Itu tergantung pada cara Anda menelusuri.
Jika Anda mencari seperti ini:
/* 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
maka Anda perlu:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
Dalam hal ini, table1
akan memimpin di NESTED LOOPS
dan indeks Anda hanya dapat digunakan jika table1
diindeks terlebih dahulu.
Jika Anda mencari seperti ini:
/* 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
maka Anda perlu:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
karena alasan di atas.
Anda tidak perlu indeks independen di sini. Indeks komposit dapat digunakan di mana saja di mana indeks biasa pada kolom pertama dapat digunakan. Jika Anda menggunakan indeks independen, Anda tidak akan dapat menelusuri kedua nilai secara efisien:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
Untuk kueri seperti ini, Anda memerlukan setidaknya satu indeks di kedua kolom.
Tidak ada salahnya untuk memiliki indeks tambahan untuk bidang kedua:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)
Kunci utama akan digunakan untuk pencarian on both values
dan untuk penelusuran berdasarkan nilai table_1
, indeks tambahan akan digunakan untuk pencarian berdasarkan nilai table_2
.