sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo indexar correctamente una tabla de enlaces para una conexión de muchos a muchos en MySQL?

Depende de cómo busques.

Si buscas así:

/* 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 necesitas:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

En este caso, table1 estará liderando en NESTED LOOPS y su índice solo se podrá usar cuando table1 se indexa primero.

Si buscas así:

/* 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 necesitas:

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 todas partes donde se puede usar un índice simple en la primera columna. Si usa índices independientes, no podrá buscar de manera eficiente 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 como esta, necesitará 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)

La clave principal se utilizará para búsquedas on both values y para búsquedas basadas en el valor de table_1 , se usará un índice adicional para búsquedas basadas en el valor de table_2 .