इससे आपकी मदद करनी चाहिए। आपकी क्वेरी पुनर्लेखन इस प्रकार है:
SELECT c1, Sum(c2)
FROM table
WHERE c4 = 2011
AND c5 = 0
AND c6 In (6,9,11)
AND c3 IS NOT NULL
GROUP BY c1
अब स्तंभों पर एक समग्र सूचकांक बनाने (सी 4, सी 5, सी 6) इसी क्रम में कॉलम के साथ। आपके सूचकांक में कॉलम आपके WHERE खंड में कॉलम के समान क्रम में प्रकट होना चाहिए। अन्यथा सूचकांक काम नहीं करेगा। इस सूचकांक की चुनिंदाता इतनी संकीर्ण है कि अस्थायी तालिका (समूह द्वारा) के लिए एक फाइलोर्ट तेजी से होना चाहिए।
क्वेरी के अंत में सी 3 को स्थानांतरित करने का कारण निम्न है। उदाहरण के तौर पर, मान लीजिए कि सी 3 0 और 100 के बीच मूल्य ले सकता है (या यह शून्य हो सकता है)। यदि आप "पूर्ण नहीं है" क्वेरी चलाते हैं, तो माईस्क्ल को लगभग सभी बी-ट्री इंडेक्स को पार करने की आवश्यकता होती है जो कि नल के अनुरूप किनारों को छोड़कर। इसलिए, MySQL निर्णय लेता है कि एक पूर्ण तालिका स्कैन इंडेक्स में सभी अलग-अलग पथों के माध्यम से चलने से एक आसान विकल्प है। दूसरी ओर, आप देखेंगे कि यदि आपकी क्वेरी "आईएस न्यूल" थी और आपकी अनुक्रमणिका (सी 3, सी 4, सी 5, सी 6) थी तो माईस्क्ल इस सूचकांक का उपयोग करेगा। ऐसा इसलिए है क्योंकि इस मामले में माईस्क्ल को केवल नल मूल्य के अनुरूप इंडेक्स पेड़ के हिस्से को पार करने की आवश्यकता है।
इंडेक्स की तरह माईएसQL की जरूरत प्रश्न में पूछताछ पर बहुत अधिक निर्भर है। सभी कॉलम पर इंडेक्स बनाना, जैसा कि @ लुइस ने सुझाव दिया है, एक अच्छा विचार नहीं है!
ध्यान रखें कि MySQL केवल प्रति तालिका एक इंडेक्स का उपयोग कर सकता है, इसलिए यदि आप ग्रुप बाय को अनुकूलित करने के लिए कॉलम पर एक इंडेक्स डालते हैं तो आप खुद को चोट पहुंचाने के लिए कह सकते हैं कि WHERE क्लॉज अप्रत्याशित हैं और अंत में अधिक काम है किया जाना है (यानी पूर्ण टेबल स्कैन)। –
मैं समझता हूं, लेकिन क्या एक ऐसा इंडेक्स बनाने का कोई तरीका है जिसका उपयोग ग्रुप बाय और कहां क्लॉज दोनों द्वारा किया जा सकता है? – bradvido