चौराहे की मेज पर आपको एक मिश्रित अनुक्रमणिका चाहिए:
ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);
उस अनुक्रमणिका में स्तंभों का क्रम महत्वपूर्ण है!
आप जिस चीज की उम्मीद कर रहे हैं, वह यह है कि जॉइन इंस्ट्रूमेंट टेबल से शुरू होगा, फिर id_instrument के आधार पर कंपाउंड इंडेक्स में मैचिंग इंडेक्स एंट्री देखें। फिर एक बार जब उसे वह अनुक्रमणिका प्रविष्टि मिल जाती है, तो उसके पास संबंधित id_tool निःशुल्क होता है। इसलिए इसे इंस्ट्रूमेंट_टूल्स टेबल को बिल्कुल भी पढ़ने की जरूरत नहीं है, इसे केवल इंडेक्स एंट्री को पढ़ने की जरूरत है। इससे आपके EXPLAIN में tools_tools तालिका के लिए "इंडेक्स का उपयोग करना" टिप्पणी देनी चाहिए।
इससे मदद मिलनी चाहिए, लेकिन आप अस्थायी तालिका और फ़ाइल सॉर्ट से बच नहीं सकते हैं, क्योंकि जिन स्तंभों के आधार पर आप समूह बना रहे हैं और उनके आधार पर क्रमित कर रहे हैं, वे अनुक्रमणिका का उपयोग नहीं कर सकते हैं।
आप MySQL को अस्थायी तालिकाओं के लिए उपयोग की जा सकने वाली मेमोरी के आकार को बढ़ाकर डिस्क पर अस्थायी तालिका लिखने से बचने की कोशिश कर सकते हैं:
mysql> SET GLOBAL tmp_table_size = 256*1024*1024; -- 256MB
mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB
वह आंकड़ा तो एक उदाहरण मात्र है। मुझे नहीं पता कि आपके मामले में अस्थायी तालिका के लिए यह कितना बड़ा होगा।