आपको हर व्हेयर कंडीशन के लिए और हर जॉइन के लिए... ऑन कंडीशन के लिए एक लुक अप करना होगा। दोनों एक ही काम करते हैं।
मान लीजिए हम लिखते हैं
select name
from customer
where customerid=37;
किसी भी तरह डीबीएमएस को ग्राहक आईडी =37 के साथ रिकॉर्ड या रिकॉर्ड ढूंढना पड़ता है। यदि कोई अनुक्रमणिका नहीं है, तो ऐसा करने का एकमात्र तरीका ग्राहक आईडी की तुलना 37 से तालिका में प्रत्येक रिकॉर्ड को पढ़ना है। यहां तक कि जब उसे एक मिल जाता है, तो उसके पास यह जानने का कोई तरीका नहीं है कि केवल एक ही है, इसलिए इसे ढूंढते रहना होगा अन्य।
यदि आप ग्राहक आईडी पर एक इंडेक्स बनाते हैं, तो डीबीएमएस के पास इंडेक्स को बहुत जल्दी खोजने के तरीके हैं। यह अनुक्रमिक खोज नहीं है, बल्कि, डेटाबेस के आधार पर, एक बाइनरी खोज या कुछ अन्य कुशल विधि है। वास्तव में कैसे कोई फर्क नहीं पड़ता, स्वीकार करें कि यह अनुक्रमिक से बहुत तेज है। फिर सूचकांक इसे सीधे उपयुक्त रिकॉर्ड या रिकॉर्ड में ले जाता है। इसके अलावा, यदि आप निर्दिष्ट करते हैं कि सूचकांक "अद्वितीय" है, तो डेटाबेस जानता है कि केवल एक ही हो सकता है, इसलिए यह एक सेकंड की तलाश में समय बर्बाद नहीं करता है। (और DBMS आपको एक सेकंड जोड़ने से रोकेगा।)
अब इस प्रश्न पर विचार करें:
select name
from customer
where city='Albany' and state='NY';
अब हमारे पास दो शर्तें हैं। यदि आपके पास उन क्षेत्रों में से केवल एक पर एक अनुक्रमणिका है, तो डीबीएमएस उस अनुक्रमणिका का उपयोग अभिलेखों के सबसेट को खोजने के लिए करेगा, फिर क्रमिक रूप से उन्हें खोजें। उदाहरण के लिए, यदि आपके पास राज्य पर एक अनुक्रमणिका है, तो DBMS जल्दी से NY के लिए पहला रिकॉर्ड ढूंढ लेगा, फिर क्रमिक रूप से शहर ='अल्बानी' की तलाश करेगा, और यह देखना बंद कर देगा कि यह NY के लिए अंतिम रिकॉर्ड तक कब पहुँचता है।
यदि आपके पास एक इंडेक्स है जिसमें दोनों फ़ील्ड शामिल हैं, यानी "ग्राहक (राज्य, शहर) पर इंडेक्स बनाएं", तो डीबीएमएस तुरंत सही रिकॉर्ड पर ज़ूम कर सकता है।
यदि आपके पास दो अलग-अलग इंडेक्स हैं, प्रत्येक फ़ील्ड पर एक, डीबीएमएस के पास विभिन्न नियम होंगे जो यह तय करने के लिए लागू होते हैं कि किस इंडेक्स का उपयोग करना है। फिर, यह कैसे किया जाता है यह आपके द्वारा उपयोग किए जा रहे विशेष डीबीएमएस पर निर्भर करता है, लेकिन मूल रूप से यह रिकॉर्ड की कुल संख्या, विभिन्न मूल्यों की संख्या और मूल्यों के वितरण पर आंकड़े रखने की कोशिश करता है। फिर यह उन अभिलेखों को क्रमिक रूप से खोजेगा जो दूसरी शर्त को पूरा करते हैं। इस मामले में डीबीएमएस शायद यह देखेगा कि राज्यों की तुलना में कई और शहर हैं, इसलिए शहर के सूचकांक का उपयोग करके यह जल्दी से 'अल्बानी' रिकॉर्ड को ज़ूम कर सकता है। फिर यह क्रमिक रूप से इन्हें खोजेगा, 'NY' के विरुद्ध प्रत्येक की स्थिति की जाँच करेगा। यदि आपके पास अल्बानी, कैलिफ़ोर्निया के रिकॉर्ड हैं तो इन्हें छोड़ दिया जाएगा।
प्रत्येक जॉइन के लिए किसी न किसी प्रकार के लुक-अप की आवश्यकता होती है।
मान लीजिए हम लिखते हैं
select customer.name
from transaction
join customer on transaction.customerid=customer.customerid
where transaction.transactiondate='2010-07-04' and customer.type='Q';
अब DBMS को तय करना है कि पहले किस टेबल को पढ़ना है, वहां से उपयुक्त रिकॉर्ड्स का चयन करना है, और फिर दूसरी टेबल में मैचिंग रिकॉर्ड्स को ढूंढना है।
यदि आपके पास transaction.transactiondate और customer.customerid पर एक अनुक्रमणिका थी, तो सबसे अच्छी योजना इस तिथि के साथ सभी लेन-देन को खोजने की होगी, और फिर उनमें से प्रत्येक के लिए ग्राहक से मेल खाने वाले ग्राहक को ढूंढें, और फिर सत्यापित करें कि ग्राहक के पास है सही प्रकार।
यदि आपके पास Customer.customerid पर कोई अनुक्रमणिका नहीं है, तो DBMS जल्दी से लेन-देन ढूंढ सकता है, लेकिन फिर प्रत्येक लेनदेन के लिए उसे एक मिलान ग्राहक की तलाश में ग्राहक तालिका को क्रमिक रूप से खोजना होगा। (यह संभवतः बहुत धीमा होगा।)
इसके बजाय मान लीजिए कि आपके पास केवल एक ही अनुक्रमणिका है जो लेनदेन.ग्राहक आईडी और ग्राहक प्रकार पर है। तब डीबीएमएस पूरी तरह से अलग योजना का उपयोग करेगा। यह संभवत:सही प्रकार के सभी ग्राहकों के लिए ग्राहक तालिका को स्कैन करेगा, फिर इनमें से प्रत्येक के लिए इस ग्राहक के लिए सभी लेन-देन ढूंढेगा, और क्रमिक रूप से उन्हें सही तिथि के लिए खोजेगा।
ऑप्टिमाइज़ेशन की सबसे महत्वपूर्ण कुंजी यह पता लगाना है कि कौन से इंडेक्स वास्तव में मदद करेंगे और उन इंडेक्स को बनाएंगे। अतिरिक्त, अप्रयुक्त अनुक्रमणिकाएँ डेटाबेस पर एक बोझ हैं क्योंकि उन्हें बनाए रखने के लिए काम करना पड़ता है, और यदि उनका कभी उपयोग नहीं किया जाता है तो यह व्यर्थ प्रयास है।
आप EXPLAIN कमांड के साथ बता सकते हैं कि किसी भी क्वेरी के लिए DBMS किन इंडेक्स का उपयोग करेगा। मैं यह निर्धारित करने के लिए हर समय इसका उपयोग करता हूं कि क्या मेरे प्रश्नों को अच्छी तरह से अनुकूलित किया जा रहा है या यदि मुझे अतिरिक्त अनुक्रमणिका बनानी चाहिए। (इस कमांड पर इसके आउटपुट की व्याख्या के लिए प्रलेखन पढ़ें।)
चेतावनी:याद रखें कि मैंने कहा था कि डीबीएमएस प्रत्येक तालिका में रिकॉर्ड की संख्या और विभिन्न मूल्यों की संख्या आदि पर आंकड़े रखता है। यदि डेटा बदल गया है तो EXPLAIN आपको कल की तुलना में आज पूरी तरह से अलग योजना दे सकता है। उदाहरण के लिए, यदि आपके पास कोई क्वेरी है जो दो तालिकाओं को जोड़ती है और इनमें से एक तालिका बहुत छोटी है जबकि दूसरी बड़ी है, तो यह पहले छोटी तालिका को पढ़ने और फिर बड़ी तालिका में मिलान रिकॉर्ड खोजने के लिए पक्षपाती होगी। किसी तालिका में रिकॉर्ड जोड़ने से वह बदल सकता है जो बड़ा है, और इस प्रकार DBMS को अपनी योजना बदलने के लिए प्रेरित करता है। इस प्रकार, आपको यथार्थवादी डेटा वाले डेटाबेस के विरुद्ध EXPLAINS करने का प्रयास करना चाहिए। प्रत्येक तालिका में 5 रिकॉर्ड वाले परीक्षण डेटाबेस के विरुद्ध चलना एक लाइव डेटाबेस के विरुद्ध चलने की तुलना में बहुत कम मूल्य का है।
खैर, और भी बहुत कुछ कहा जा सकता है, लेकिन मैं यहाँ कोई किताब नहीं लिखना चाहता।