अलग-अलग डेटा के लिए अलग-अलग खोज रणनीतियां मायने रखती हैं। विशेष रूप से, इंडेक्स स्कैन (जैसे रेंज) को अक्सर पंक्ति को वास्तव में पढ़ने की तलाश करनी पड़ती है। किसी बिंदु पर, इंडेक्स का उपयोग न करने की तुलना में उन सभी खोजों को करना धीमा है।
एक तुच्छ उदाहरण लें, तीन स्तंभों वाली एक तालिका:आईडी (प्राथमिक कुंजी), नाम (अनुक्रमित), जन्मदिन। कहो कि इसमें बहुत सारा डेटा है। यदि आप MySQL को बॉब के जन्मदिन की तलाश करने के लिए कहते हैं, तो यह काफी तेज़ी से कर सकता है:सबसे पहले, यह बॉब को नाम अनुक्रमणिका में पाता है (इसमें कुछ तलाश होती है, लॉग (एन) जहां n पंक्ति गणना है), फिर एक अतिरिक्त खोज डेटा फ़ाइल में वास्तविक पंक्ति पढ़ें और उसमें से जन्मदिन पढ़ें। यह पूरी तालिका को स्कैन करने की तुलना में बहुत तेज़ और बहुत तेज़ है।
इसके बाद, name like 'Z%'
करने पर विचार करें . यह शायद तालिका का काफी छोटा हिस्सा है। तो यह अभी भी तेज़ है कि Zs नाम अनुक्रमणिका में कहां से शुरू होता है, फिर प्रत्येक के लिए पंक्ति को पढ़ने के लिए डेटा फ़ाइल की तलाश करें। (यह एक रेंज स्कैन है)।
अंत में, एम-जेड से शुरू होने वाले सभी नामों के बारे में पूछने पर विचार करें। यह शायद लगभग आधा डेटा है। यह एक रेंज स्कैन कर सकता है, और फिर एक लॉट की तलाश करता है, लेकिन आधी पंक्तियों को पढ़ने के अंतिम लक्ष्य के साथ डेटाफाइल पर बेतरतीब ढंग से तलाश करना इष्टतम नहीं है:डेटा फ़ाइल पर केवल एक बड़ा अनुक्रमिक पढ़ना तेज़ होगा। इसलिए, इस मामले में, इंडेक्स को नज़रअंदाज कर दिया जाएगा।
यह वही है जो आप देख रहे हैं—आपके मामले को छोड़कर, एक और कुंजी है जिस पर वह वापस आ सकता है। (यह भी संभव है कि यह वास्तव में दिनांक अनुक्रमणिका का उपयोग कर सकता है यदि उसके पास दूसरा नहीं था, तो उसे जो भी अनुक्रमणिका सबसे तेज़ होगी उसे चुनना चाहिए। सावधान रहें कि MySQL का अनुकूलक अक्सर इसमें त्रुटियां करता है।)
तो, संक्षेप में, यह अपेक्षित है। एक क्वेरी कैसे नहीं कहती है डेटा पुनर्प्राप्त करने के लिए, बल्कि यह कहता है क्या पुनर्प्राप्त करने के लिए डेटा। माना जाता है कि डेटाबेस के अनुकूलक को इसे पुनः प्राप्त करने का सबसे तेज़ तरीका खोजना चाहिए।
आपको दोनों . पर एक इंडेक्स मिल सकता है कॉलम, क्रम में (public_key,created_on_date) दोनों ही मामलों में पसंद किया जाता है, और आपकी क्वेरी को गति देता है। ऐसा इसलिए है क्योंकि MySQL कभी भी प्रति तालिका (प्रति क्वेरी) केवल एक अनुक्रमणिका का उपयोग कर सकता है। साथ ही, तिथि समाप्त हो जाती है क्योंकि एक श्रेणी स्कैन केवल एक अनुक्रमणिका के अंतिम कॉलम पर ही कुशलता से किया जा सकता है।
[इनो डीबी में वास्तव में संकेत की एक और परत है, मुझे विश्वास है, लेकिन यह सिर्फ बिंदु को भ्रमित करेगा। इससे स्पष्टीकरण पर कोई फर्क नहीं पड़ता।]