Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête complexe prend trop de temps à transférer

Vous avez besoin d'un index composé sur la table d'intersection :

ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);

L'ordre des colonnes dans cet index est important !

Ce que vous espérez, c'est que les jointures commencent par la table d'instruments, puis recherchent l'entrée d'index correspondante dans l'index composé basé sur id_instrument. Ensuite, une fois qu'il a trouvé cette entrée d'index, il dispose gratuitement de l'outil id_tool associé. Il n'a donc pas du tout besoin de lire la table instrument_tools, il lui suffit de lire l'entrée d'index. Cela devrait donner le commentaire "Utilisation de l'index" dans votre EXPLAIN pour la table instruments_tools.

Cela devrait aider, mais vous ne pouvez pas éviter la table temporaire et le tri de fichiers, car les colonnes que vous regroupez et triez ne peuvent pas utiliser d'index.

Vous pouvez essayer de faire en sorte que MySQL évite d'écrire la table temporaire sur le disque en augmentant la taille de la mémoire qu'il peut utiliser pour les tables temporaires :

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

Ce chiffre n'est qu'un exemple. Je n'ai aucune idée de la taille que devrait avoir la table temporaire dans votre cas.