Dipende da come si cerca.
se si cerca in questo modo:
/* 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
allora avete bisogno:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
In questo caso, table1
guiderà nella NESTED LOOPS
e l'indice sarà utilizzabile solo quando table1
è indicizzato prima .
Se si cerca in questo modo:
/* 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
allora avete bisogno:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
per i motivi di cui sopra.
Non hai bisogno di indici indipendenti qui. Un indice composito può essere utilizzato ovunque sia possibile utilizzare un indice semplice sulla prima colonna. Se si utilizzano gli indici indipendenti, non sarà in grado di cercare in modo efficiente per entrambi i valori:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
Per una query come questo, avrete bisogno di almeno un indice su entrambe le colonne.
Non è mai male avere un indice aggiuntivo per il secondo campo:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)
chiave primaria verrà utilizzato per le ricerche on both values
e per le ricerche in base al valore di table_1
, indice aggiuntivo saranno utilizzati per le ricerche basate su valore di table_2
.
Grazie per la risposta dettagliata, ma cosa succede se cerco in entrambi i modi? Inoltre sto usando Hibernate quindi non sono nemmeno sicuro di quale sia il suo utilizzo. – serg
SE cerchi in entrambi i modi, avrai bisogno di DUE indici: un composito per il PRIMARY KEY e uno per la colonna che è il secondo nel PRIMARY KEY. È in fondo al mio post. – Quassnoi
Grande risposta, grazie per il dettaglio –