इसकी आवश्यकता क्यों है?
जब डेटा को डिस्क-आधारित भंडारण उपकरणों पर संग्रहीत किया जाता है, तो इसे डेटा के ब्लॉक के रूप में संग्रहीत किया जाता है। इन ब्लॉकों को उनकी संपूर्णता में एक्सेस किया जाता है, जिससे उन्हें परमाणु डिस्क एक्सेस ऑपरेशन बनाया जाता है। डिस्क ब्लॉक लिंक किए गए सूचियों के समान ही संरचित हैं; दोनों में डेटा के लिए एक सेक्शन होता है, अगले नोड (या ब्लॉक) के स्थान के लिए एक पॉइंटर, और दोनों को संचित रूप से संग्रहीत करने की आवश्यकता नहीं होती है।
इस तथ्य के कारण कि कई रिकॉर्ड केवल एक फ़ील्ड पर सॉर्ट किए जा सकते हैं, हम यह बता सकते हैं कि सॉर्ट किए गए फ़ील्ड पर खोज करने के लिए एक रेखीय खोज की आवश्यकता होती है जिसमें N/2
ब्लॉक एक्सेस की आवश्यकता होती है (औसतन), जहां N
ब्लॉक की संख्या है मेज पर फैला है। यदि वह फ़ील्ड एक गैर-कुंजी फ़ील्ड है (अर्थात जिसमें अद्वितीय प्रविष्टियाँ नहीं हैं) तो N
ब्लॉक एक्सेस पर पूरे टेबलस्पेस को खोजना होगा ।
जबकि एक सॉर्ट किए गए फ़ील्ड के साथ, एक बाइनरी खोज का उपयोग किया जा सकता है, जिसमें log2 N
ब्लॉक एक्सेस होते हैं। चूंकि डेटा को एक गैर-कुंजी फ़ील्ड दिया जाता है, इसलिए बाकी तालिका को एक बार उच्च मान मिलने पर, डुप्लिकेट मानों के लिए खोज करने की आवश्यकता नहीं होती है। इस प्रकार प्रदर्शन में वृद्धि पर्याप्त है।
अनुक्रमण क्या है?
अनुक्रमण कई क्षेत्रों पर कई रिकॉर्ड को सॉर्ट करने का एक तरीका है। किसी तालिका में फ़ील्ड पर एक इंडेक्स बनाने से एक अन्य डेटा संरचना बनती है जो फ़ील्ड मान रखती है, और रिकॉर्ड के लिए एक संकेतक जो इसे संबंधित है। इस सूचकांक संरचना को तब क्रमबद्ध किया जाता है, जिससे बाइनरी खोजों को उस पर प्रदर्शन करने की अनुमति मिलती है।
अनुक्रमण के लिए नकारात्मक पक्ष यह है कि इन सूचकांकों को डिस्क पर अतिरिक्त स्थान की आवश्यकता होती है क्योंकि सूचकांकों को MyISAM इंजन का उपयोग करके तालिका में एक साथ संग्रहीत किया जाता है, यह फ़ाइल अंतर्निहित फ़ाइल सिस्टम की आकार सीमा तक जल्दी से पहुँच सकती है यदि एक ही तालिका के भीतर कई फ़ील्ड्स अनुक्रमणित किए गए हों ।
यह कैसे काम करता है?
सबसे पहले, चलो एक नमूना डेटाबेस तालिका स्कीमा की रूपरेखा तैयार करते हैं;
फ़ील्ड का नाम डेटा प्रकार डिस्क पर आकार
आईडी (प्राथमिक कुंजी) Unsigned INT 4 बाइट्स
फर्स्टनाम चार (50) 50 बाइट्स
अंतिम नाम चार (50) 50 बाइट्स
emailAddress Char (100) 100 बाइट्स
नोट : चर का उपयोग varchar के स्थान पर डिस्क मान पर सटीक आकार की अनुमति देने के लिए किया गया था। इस सैंपल डेटाबेस में पाँच मिलियन पंक्तियाँ हैं और यह अनइंडैक्स है। कई प्रश्नों के प्रदर्शन का अब विश्लेषण किया जाएगा। ये आईडी (एक सॉर्ट किए गए कुंजी फ़ील्ड) का उपयोग करके एक क्वेरी है और पहले नाम (एक गैर-कुंजी रहित फ़ील्ड) का उपयोग कर रहे हैं।
उदाहरण 1 - छंटे हुए बनाम अनसुलझे खेत
बाइट्स r = 5,000,000
की रिकॉर्ड लंबाई देने वाले एक निश्चित आकार के रिकॉर्ड के हमारे नमूना डेटाबेस को देखते हुए R = 204
और उन्हें MyISAM इंजन का उपयोग करके एक तालिका में संग्रहीत किया जाता है जो डिफ़ॉल्ट ब्लॉक आकार B = 1,024
बाइट्स का उपयोग कर रहा है । तालिका का अवरोधन कारक bfr = (B/R) = 1024/204 = 5
डिस्क ब्लॉक प्रति रिकॉर्ड होगा । तालिका रखने के लिए आवश्यक ब्लॉक की कुल संख्या N = (r/bfr) = 5000000/5 = 1,000,000
ब्लॉक है।
आईडी फ़ील्ड पर एक रेखीय खोज को N/2 = 500,000
एक मूल्य खोजने के लिए औसत ब्लॉक एक्सेस की आवश्यकता होगी , यह देखते हुए कि आईडी फ़ील्ड एक महत्वपूर्ण फ़ील्ड है। लेकिन चूंकि आईडी फ़ील्ड को भी सॉर्ट किया गया है, इसलिए बाइनरी खोज का संचालन किया जा सकता है, जिसमें औसत log2 1000000 = 19.93 = 20
ब्लॉक एक्सेस की आवश्यकता होती है । तुरंत हम देख सकते हैं कि यह एक व्यापक सुधार है।
अब FirstName फ़ील्ड को न तो सॉर्ट किया गया है और न ही एक महत्वपूर्ण फ़ील्ड है, इसलिए एक बाइनरी खोज असंभव है, न ही मान अद्वितीय हैं, और इस प्रकार तालिका को एक सटीक N = 1,000,000
ब्लॉक एक्सेस के लिए अंत की खोज करने की आवश्यकता होगी । यह स्थिति है कि अनुक्रमण का उद्देश्य सही करना है।
यह देखते हुए कि एक इंडेक्स रिकॉर्ड में केवल अनुक्रमित फ़ील्ड और मूल रिकॉर्ड के लिए एक संकेतक होता है, यह इस कारण से खड़ा होता है कि यह उस बहु-फ़ील्ड रिकॉर्ड से छोटा होगा जो इसे इंगित करता है। इसलिए इंडेक्स को मूल तालिका की तुलना में कम डिस्क ब्लॉक की आवश्यकता होती है, इसलिए इसके माध्यम से पुनरावृति के लिए कम ब्लॉक एक्सेस की आवश्यकता होती है। पहले नाम क्षेत्र पर एक सूचकांक के लिए स्कीमा नीचे उल्लिखित है;
फ़ील्ड का नाम डेटा प्रकार डिस्क पर आकार
फर्स्टनाम चार (50) 50 बाइट्स
(रिकॉर्ड सूचक) विशेष 4 बाइट्स
नोट : MySQL में पॉइंटर्स तालिका के आकार के आधार पर लंबाई में 2, 3, 4 या 5 बाइट्स हैं।
उदाहरण 2 - अनुक्रमण
बाइट्स r = 5,000,000
की एक इंडेक्स रिकॉर्ड लंबाई R = 54
और डिफ़ॉल्ट ब्लॉक आकार B = 1,024
बाइट्स का उपयोग करके रिकॉर्ड के हमारे नमूना डेटाबेस को देखते हुए । सूचकांक का अवरोधक कारक bfr = (B/R) = 1024/54 = 18
प्रति डिस्क ब्लॉक रिकॉर्ड होगा । सूचकांक रखने के लिए आवश्यक ब्लॉक की कुल संख्या N = (r/bfr) = 5000000/18 = 277,778
ब्लॉक है।
अब FirstName फ़ील्ड का उपयोग करके खोज प्रदर्शन बढ़ाने के लिए सूचकांक का उपयोग कर सकती है। यह log2 277778 = 18.08 = 19
ब्लॉक एक्सेस के औसत के साथ सूचकांक की एक द्विआधारी खोज के लिए अनुमति देता है । वास्तविक रिकॉर्ड का पता खोजने के लिए, जिसे पढ़ने के लिए एक और ब्लॉक एक्सेस की आवश्यकता होती है, कुल एक्सेस को ब्लॉक करने के लिए लाने के लिए 19 + 1 = 20
, गैर-अनुक्रमित तालिका में पहले नाम मैच को खोजने के लिए आवश्यक 1,000,000 ब्लॉक एक्सेस से बहुत रोना पड़ता है ।
इसका उपयोग कब किया जाना चाहिए?
यह देखते हुए कि एक इंडेक्स बनाने के लिए अतिरिक्त डिस्क स्थान की आवश्यकता होती है (उपरोक्त उदाहरण से अतिरिक्त 277,778 ब्लॉक, एक ~ 28% वृद्धि), और वह भी बहुत से सूचकांकों के कारण फाइल सिस्टम के आकार की सीमा से उत्पन्न होने वाले मुद्दे पैदा हो सकते हैं, सही का चयन करने के लिए सावधानीपूर्वक सोचा जाना चाहिए। क्षेत्रों को अनुक्रमणित करें।
चूंकि सूचकांकों का उपयोग केवल रिकॉर्ड के भीतर एक मेल खाने वाले क्षेत्र की खोज में तेजी लाने के लिए किया जाता है, यह इस कारण से होता है कि आउटपुट के लिए उपयोग किए जाने वाले अनुक्रमण फ़ील्ड केवल डिस्क स्थान और प्रसंस्करण समय की बर्बादी होगी जब एक सम्मिलित या ऑपरेशन हटाएं, और इस तरह। से बचा जाना चाहिए। एक बाइनरी खोज की प्रकृति को देखते हुए, डेटा की कार्डिनैलिटी या विशिष्टता महत्वपूर्ण है। 2 की कार्डिनैलिटी के साथ एक फ़ील्ड पर अनुक्रमित करने से डेटा आधे में विभाजित हो जाएगा, जबकि 1,000 की कार्डिनैलिटी लगभग 1,000 रिकॉर्ड लौटाएगी। इस तरह की कम कार्डिनैलिटी के साथ प्रभावशीलता एक रैखिक प्रकार तक कम हो जाती है, और क्वेरी ऑप्टिमाइज़र इंडेक्स का उपयोग करने से बचेंगे यदि कार्डिनैलिटी रिकॉर्ड संख्या का 30% से कम है, तो प्रभावी रूप से इंडेक्स को अंतरिक्ष की बर्बादी बना देता है।