Depende de cómo busque.
si se busca de esta manera:
/* 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
entonces usted necesita:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
En este caso, table1
estará al frente de NESTED LOOPS
y su índice será útil sólo cuando table1
se indexa primero .
Si usted busca la siguiente manera:
/* 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
entonces usted necesita:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
por las razones anteriores.
No necesita índices independientes aquí. Un índice compuesto se puede usar en cualquier lugar donde se pueda usar un índice simple en la primera columna. Si utiliza índices independientes, que no será capaz de buscar de manera eficiente para ambos valores:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
Para una consulta de este tipo, se necesitan al menos un índice en ambas columnas.
Nunca es malo tener un índice adicional para el segundo 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)
Clave primaria será utilizado para las búsquedas on both values
y para las búsquedas basadas en el valor de table_1
, índice adicionales se utilizarán para búsquedas basadas en valor de table_2
.
Gracias por la respuesta detallada, pero ¿y si busco en ambos sentidos? También estoy usando Hibernate, así que no estoy seguro de qué manera lo está usando. – serg
SI busca en ambos sentidos, necesitará DOS índices: un compuesto para la LLAVE PRIMARIA y uno simple para la columna que es el segundo en la LLAVE PRINCIPAL. Está en el final de mi publicación. – Quassnoi
Gran respuesta gracias por el detalle –