Potřebujete složený index na průsečíkové tabulce:
ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);
Pořadí sloupců v tomto indexu je důležité!
V co doufáte, je, že spojení začnou tabulkou nástrojů a poté vyhledá odpovídající položku indexu ve složeném indexu na základě id_instrument. Poté, jakmile najde tuto položku indexu, má související id_tool zdarma. Nemusí tedy vůbec číst tabulku instrument_tools, stačí mu číst pouze položku rejstříku. To by mělo obsahovat komentář "Using index" ve vašem EXPLAIN pro tabulku nástrojů_nástroje.
To by mělo pomoci, ale nemůžete se vyhnout dočasné tabulce a řazení souborů, protože sloupce, podle kterých seskupujete a podle kterých třídíte, nemohou používat index.
Můžete zkusit, aby se MySQL vyhnula zápisu dočasné tabulky na disk zvětšením velikosti paměti, kterou může použít pro dočasné tabulky:
mysql> SET GLOBAL tmp_table_size = 256*1024*1024; -- 256MB
mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB
Ten údaj je jen příklad. Nemám ponětí, jak velká by musela být pro dočasnou tabulku ve vašem případě.