आपके द्वारा वर्णित सूचकांक बहुत अधिक व्यर्थ है। इंडेक्स का सबसे अच्छा उपयोग तब किया जाता है जब आपको छोटा . चुनने की आवश्यकता होती है कुल पंक्तियों की तुलना में पंक्तियों की संख्या।
इसका कारण यह है कि डेटाबेस किसी तालिका तक कैसे पहुंचता है। तालिकाओं का मूल्यांकन या तो एक पूर्ण तालिका स्कैन द्वारा किया जा सकता है, जहां प्रत्येक ब्लॉक को पढ़ा जाता है और बदले में संसाधित किया जाता है। या एक पंक्तिबद्ध या कुंजी लुकअप द्वारा, जहां डेटाबेस में एक कुंजी/पंक्ति होती है और सटीक पंक्ति को पढ़ने की आवश्यकता होती है।
उस मामले में जहां आप प्राथमिक कुंजी या किसी अन्य अद्वितीय अनुक्रमणिका के आधार पर जहां क्लॉज का उपयोग करते हैं, उदाहरण के लिए। where id = 1
, डेटाबेस पंक्ति का डेटा कहाँ संग्रहीत किया जाता है, इसका सटीक संदर्भ प्राप्त करने के लिए अनुक्रमणिका का उपयोग कर सकता है। यह एक पूर्ण तालिका स्कैन करने और प्रत्येक ब्लॉक को संसाधित करने से स्पष्ट रूप से अधिक कुशल है।
अब वापस अपने उदाहरण पर, आपके पास where status = 'enabled'
. का एक खंड है , सूचकांक 150m पंक्तियाँ लौटाएगा और डेटाबेस को अलग-अलग छोटे पठन का उपयोग करके प्रत्येक पंक्ति को बारी-बारी से पढ़ना होगा। जबकि तालिका को पूर्ण तालिका स्कैन के साथ एक्सेस करने से डेटाबेस को अधिक कुशल बड़े रीड का उपयोग करने की अनुमति मिलती है।
एक बिंदु है जिस पर इंडेक्स का उपयोग करने के बजाय केवल एक पूर्ण टेबल स्कैन करना बेहतर होता है। Mysql के साथ आप FORCE INDEX (idx_name)
. का उपयोग कर सकते हैं प्रत्येक टेबल एक्सेस विधि के बीच तुलना की अनुमति देने के लिए आपकी क्वेरी के हिस्से के रूप में।
संदर्भ:http://dev .mysql.com/doc/refman/5.5/hi/how-to-avoid-table-scan.html