आपको निश्चित रूप से अनुक्रमण पर पढ़ने में कुछ समय बिताना चाहिए, इसके बारे में बहुत कुछ लिखा है, और यह समझना महत्वपूर्ण है कि क्या हो रहा है।
मोटे तौर पर, एक सूचकांक एक तालिका की पंक्तियों पर एक आदेश देता है।
सादगी के लिए, एक मेज की कल्पना करें बस एक बड़ी CSV फ़ाइल है। जब भी कोई पंक्ति डाली जाती है, उसे अंत में डाला जाता है । तो तालिका का "प्राकृतिक" क्रम केवल वह क्रम है जिसमें पंक्तियाँ डाली गई थीं।
कल्पना कीजिए कि आपने CSV फ़ाइल को बहुत ही अल्पविकसित स्प्रेडशीट एप्लिकेशन में लोड किया है। यह सब स्प्रेडशीट डेटा प्रदर्शित करता है, और क्रम में पंक्तियों को क्रमबद्ध करता है।
अब कल्पना करें कि आपको उन सभी पंक्तियों को खोजने की आवश्यकता है जिनके तीसरे स्तंभ में कुछ मूल्य "एम" है। आपके पास जो उपलब्ध है, उसे देखते हुए आपके पास केवल एक विकल्प है। आप प्रत्येक पंक्ति के लिए तीसरे स्तंभ के मान की जाँच करते हुए तालिका को स्कैन करते हैं। यदि आपको बहुत सी पंक्तियाँ मिली हैं, तो यह विधि (एक "टेबल स्कैन") एक लंबा समय ले सकती है!
अब कल्पना करें कि इस तालिका के अतिरिक्त, आपको एक इंडेक्स मिला है। यह विशेष सूचकांक तीसरे कॉलम में मूल्यों का सूचकांक है। सूचकांक तीसरे स्तंभ से सभी मूल्यों को सूचीबद्ध करता है, कुछ सार्थक क्रम में (जैसे, वर्णानुक्रम में) और उनमें से प्रत्येक के लिए, पंक्ति संख्याओं की एक सूची प्रदान करता है जहां वह मूल्य प्रकट होता है।
अब आपके पास सभी पंक्तियों को खोजने के लिए एक अच्छी रणनीति है जहां तीसरे कॉलम का मूल्य "एम" है। उदाहरण के लिए, आप एक द्विआधारी खोज कर सकते हैं ! जबकि टेबल स्कैन के लिए आपको N पंक्तियों को देखने की आवश्यकता होती है (जहाँ N पंक्तियों की संख्या होती है), द्विआधारी खोज के लिए केवल यह आवश्यक है कि आप लॉग-एन इंडेक्स प्रविष्टियों को बहुत ही खराब स्थिति में देखें। वाह, यह बहुत आसान है यकीन है!
बेशक, अगर आपके पास यह सूचकांक है, और आप तालिका में पंक्तियों को जोड़ रहे हैं (अंत में, क्योंकि यह हमारी वैचारिक तालिका कैसे काम करती है), आपको हर बार सूचकांक को अपडेट करने की आवश्यकता है। इसलिए आप नई पंक्तियों को लिखते समय थोड़ा अधिक काम करते हैं, लेकिन जब आप किसी चीज़ की खोज कर रहे होते हैं तो आप एक टन बचाते हैं।
इसलिए, सामान्य तौर पर, इंडेक्सिंग रीड दक्षता और राइट दक्षता के बीच एक व्यापार बनाता है। कोई अनुक्रमणिका के साथ, आवेषण बहुत तेज़ हो सकता है - डेटाबेस इंजन बस तालिका में एक पंक्ति जोड़ता है। जब आप इंडेक्स जोड़ते हैं, तो इंसर्ट करते समय इंजन को प्रत्येक इंडेक्स को अपडेट करना चाहिए।
दूसरी ओर, रीड बहुत तेज हो जाते हैं।
उम्मीद है कि आपके पहले दो प्रश्नों को शामिल किया गया है (जैसा कि अन्य ने उत्तर दिया है - आपको सही संतुलन खोजने की आवश्यकता है)।
आपका तीसरा परिदृश्य थोड़ा और जटिल है। यदि आप LIKE का उपयोग कर रहे हैं, तो अनुक्रमण इंजन आमतौर पर आपकी रीड स्पीड को पहले "%" तक बढ़ाने में मदद करेंगे। दूसरे शब्दों में, यदि आप ''%% बार% 'कॉलम का चयन कर रहे हैं, तो डेटाबेस सभी पंक्तियों को खोजने के लिए सूचकांक का उपयोग करेगा जहां कॉलम "फू" से शुरू होता है, और फिर सब्मिट खोजने के लिए उस मध्यवर्ती पंक्तियों को स्कैन करने की आवश्यकता होती है। जिसमें "बार" शामिल है। चुनें ... जहां कॉलम '% बार%' सूचकांक का उपयोग नहीं कर सकता। मुझे आशा है कि आप देख सकते हैं क्यों।
अंत में, आपको एक से अधिक कॉलम पर अनुक्रमित के बारे में सोचना शुरू करना होगा। अवधारणा समान है, और समान सामान के समान व्यवहार करती है - अनिवार्य रूप से, यदि आपके पास (ए, बी, सी) पर एक सूचकांक है, तो इंजन बाएं से दाएं सबसे अच्छा के रूप में सूचकांक का उपयोग करना जारी रखेगा। तो कॉलम पर एक खोज एक (ए, बी, सी) सूचकांक का उपयोग कर सकती है, जैसा कि एक (ए, बी) पर होगा। हालाँकि, यदि आप WHERE = 5 और c = 1 खोज रहे हैं तो इंजन को एक पूर्ण टेबल स्कैन करने की आवश्यकता होगी
उम्मीद है कि यह थोड़ा प्रकाश डालने में मदद करता है, लेकिन मुझे यह दोहराना चाहिए कि आप अच्छे लेखों के लिए खुदाई करते हुए कुछ घंटे बिता सकते हैं जो इन चीजों को गहराई से समझाते हैं। अपने विशेष डेटाबेस सर्वर के प्रलेखन को पढ़ना भी एक अच्छा विचार है। जिस तरह से क्वेरी प्लानर्स द्वारा इंडेक्स लागू और उपयोग किए जाते हैं, वे काफी व्यापक रूप से भिन्न हो सकते हैं।