sql >> Databasteknik >  >> RDS >> Mysql

komplex fråga tar för mycket tid att överföra

Du behöver ett sammansatt index på skärningstabellen:

ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);

Ordningen på kolumner i det indexet är viktig!

Det du hoppas på är att sammanfogningarna börjar med instrumenttabellen, leta sedan upp den matchande indexposten i det sammansatta indexet baserat på id_instrument. Sedan när den hittar den indexposten har den det relaterade id_tool gratis. Så den behöver inte läsa tabellen instrument_tools alls, den behöver bara läsa indexposten. Det borde ge kommentaren "Using index" i din EXPLAIN för tabellen instruments_tools.

Det borde hjälpa, men du kan inte undvika temptabellen och filsortering, eftersom kolumnerna du grupperar efter och sorterar efter inte kan använda ett index.

Du kan försöka få MySQL att undvika att skriva den tillfälliga tabellen till disken genom att öka storleken på minnet som den kan använda för tillfälliga tabeller:

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

Den siffran är bara ett exempel. Jag har ingen aning om hur stort det skulle behöva vara för tempbordet i ditt fall.




  1. Förstå Self Join

  2. Hur man undviker fel -> Dubblett inmatning

  3. Främmande nyckel till icke-primär nyckel

  4. MYSQL:jämför ett NULL-datum med CURRENT_DATE