सबसे पहले जागरूक होने वाली बात यह है कि MySQL केवल एक इंडेक्स प्रति psuedo-SELECT (स्टेटमेंट नहीं) का उपयोग करता है - जब आप EXPLAIN का उपयोग करके SELECT का आउटपुट देखते हैं, तो आप देखेंगे कि कौन सा इंडेक्स प्रति चुना गया था। EXPLAIN को केवल SELECTS पर चलाया जा सकता है, इसलिए हमें यह मान लेना होगा कि जब आप SELECT के लिए सिंटैक्स को स्वैप करते हैं तो एक DELETE/UPDATE उसी योजना का उपयोग कर रहा है...
मेरी जानकारी में अधिकांश डेटाबेस (एम्बेडेड वाले विषम हो सकते हैं) निम्नलिखित खंडों में अनुक्रमणिका के उपयोग का समर्थन करते हैं:
- चुनें
- जॉइन करें (ANSI-92 सिंटैक्स)
- कहां (क्योंकि वहां ANSI-89 और दोनों हैं फ़िल्टर यहाँ)
- होना (जहाँ समतुल्य है, लेकिन WHERE के विपरीत - सबक्वेरी की आवश्यकता के बिना समग्र उपयोग की अनुमति देता है)
- आदेश द्वारा
मैं GROUP BY पर 100% नहीं हूं, इसलिए मैं इसे फिलहाल छोड़ रहा हूं।
अंतत:, यह ऑप्टिमाइज़र की पसंद है कि इसके एल्गोरिदम और इसके पास मौजूद आंकड़ों के आधार पर क्या उपयोग करना है। आप ANALYZE TABLE सिंटैक्स का इस्तेमाल कर सकते हैं आँकड़ों को ताज़ा करने के लिए (समय-समय पर, कृपया लगातार नहीं)।
परिशिष्ट
MySQL अनुक्रमणिका आवंटित करने के लिए स्थान की मात्रा को भी सीमित करता है - 1,000 MyISAM तालिकाओं के लिए बाइट्स, और InnoDB तालिकाओं के लिए 767 बाइट्स . MySQL केवल एक इंडेक्स प्रति छद्म-चयन का उपयोग करने के कारण, इंडेक्स को कवर करना (इंडेक्स जिसमें एक से अधिक कॉलम शामिल हैं) एक अच्छा विचार है लेकिन यह वास्तव में सबसे आम क्वेरी का परीक्षण करने और इसके लिए अनुकूलित करने के लिए आता है जितना आप कर सकते हैं। अनुक्रमण प्राथमिकता होनी चाहिए:
- प्राथमिक कुंजी (v5 में कहीं, pk के लिए अनुक्रमणिका बनाना स्वचालित हो गया)
- विदेशी कुंजियाँ (अगले सबसे अधिक संभावित जॉइन उम्मीदवार
- फ़िल्टरेशन मानदंड (यह मानते हुए कि आपके पास जगह है)