Имате нужда от съставен индекс на пресечната таблица:
ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);
Редът на колоните в този индекс е важен!
Това, на което се надявате, е, че обединенията ще започнат с таблицата с инструменти, след което ще потърсите съвпадащия запис в индекса в съставния индекс въз основа на id_instrument. След това, след като намери този запис в индекса, той разполага със свързания id_tool безплатно. Така че изобщо не трябва да чете таблицата instrument_tools, трябва само да прочете записа в индекса. Това трябва да даде коментара „Използване на индекс“ във вашето EXPLAIN за таблицата instruments_tools.
Това би трябвало да помогне, но не можете да избегнете временната таблица и filesort, тъй като колоните, по които групирате и сортирате, не могат да използват индекс.
Можете да опитате да накарате MySQL да избягва записването на временната таблица на диск, като увеличите размера на паметта, която може да използва за временни таблици:
mysql> SET GLOBAL tmp_table_size = 256*1024*1024; -- 256MB
mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB
Тази цифра е само пример. Нямам представа колко голяма трябва да бъде за временната таблица във вашия случай.