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

la consulta compleja tarda demasiado en transferirse

Necesita un índice compuesto en la tabla de intersección:

ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);

¡El orden de las columnas en ese índice es importante!

Lo que espera es que las uniones comiencen con la tabla de instrumentos, luego busquen la entrada de índice coincidente en el índice compuesto basado en id_instrument. Luego, una vez que encuentra esa entrada de índice, tiene la id_tool relacionada de forma gratuita. Por lo tanto, no tiene que leer la tabla instrument_tools en absoluto, solo necesita leer la entrada de índice. Eso debería dar el comentario "Uso de índice" en su EXPLICACIÓN para la tabla de instrumentos_herramientas.

Eso debería ayudar, pero no puede evitar la tabla temporal y la ordenación de archivos, debido a que las columnas por las que está agrupando y ordenando no pueden usar un índice.

Puede intentar que MySQL evite escribir la tabla temporal en el disco aumentando el tamaño de la memoria que puede usar para las tablas temporales:

mysql> SET GLOBAL tmp_table_size = 256*1024*1024;      -- 256MB
mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB

Esa cifra es solo un ejemplo. No tengo idea de qué tan grande tendría que ser para la tabla temporal en su caso.