Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die Übertragung komplexer Abfragen dauert zu lange

Sie benötigen einen zusammengesetzten Index für die Schnitttabelle:

ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);

Die Reihenfolge der Spalten in diesem Index ist wichtig!

Was Sie hoffen, ist, dass die Joins mit der Instrumententabelle beginnen und dann den passenden Indexeintrag im zusammengesetzten Index basierend auf id_instrument nachschlagen. Sobald es diesen Indexeintrag gefunden hat, hat es das zugehörige id_tool kostenlos. Es muss also überhaupt nicht die Tabelle instrument_tools lesen, sondern nur den Indexeintrag. Das sollte den "Using index"-Kommentar in Ihrem EXPLAIN für die instruments_tools-Tabelle ergeben.

Das sollte helfen, aber Sie können die temporäre Tabelle und die Dateisortierung nicht vermeiden, da die Spalten, nach denen Sie gruppieren und sortieren, keinen Index verwenden können.

Sie können versuchen, MySQL dazu zu bringen, das Schreiben der temporären Tabelle auf die Festplatte zu vermeiden, indem Sie die Größe des Speichers erhöhen, den es für temporäre Tabellen verwenden kann:

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

Diese Zahl ist nur ein Beispiel. Ich habe keine Ahnung, wie groß es in Ihrem Fall für die temporäre Tabelle sein müsste.