डेटाबेस अनुक्रमण कैसे काम करता है? [बन्द है]


2419

यह देखते हुए कि इंडेक्सिंग इतना महत्वपूर्ण है क्योंकि आपका डेटा सेट आकार में बढ़ता है, क्या कोई समझा सकता है कि डेटाबेस-एग्नॉस्टिक स्तर पर इंडेक्सिंग कैसे काम करता है?

किसी फ़ील्ड को अनुक्रमित करने के लिए क्वेरीज़ की जानकारी के लिए, मैं एक डेटाबेस कॉलम को कैसे अनुक्रमित करूँ , इसकी जाँच करें

जवाबों:


3546

इसकी आवश्यकता क्यों है?

जब डेटा को डिस्क-आधारित भंडारण उपकरणों पर संग्रहीत किया जाता है, तो इसे डेटा के ब्लॉक के रूप में संग्रहीत किया जाता है। इन ब्लॉकों को उनकी संपूर्णता में एक्सेस किया जाता है, जिससे उन्हें परमाणु डिस्क एक्सेस ऑपरेशन बनाया जाता है। डिस्क ब्लॉक लिंक किए गए सूचियों के समान ही संरचित हैं; दोनों में डेटा के लिए एक सेक्शन होता है, अगले नोड (या ब्लॉक) के स्थान के लिए एक पॉइंटर, और दोनों को संचित रूप से संग्रहीत करने की आवश्यकता नहीं होती है।

इस तथ्य के कारण कि कई रिकॉर्ड केवल एक फ़ील्ड पर सॉर्ट किए जा सकते हैं, हम यह बता सकते हैं कि सॉर्ट किए गए फ़ील्ड पर खोज करने के लिए एक रेखीय खोज की आवश्यकता होती है जिसमें 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% से कम है, तो प्रभावी रूप से इंडेक्स को अंतरिक्ष की बर्बादी बना देता है।


8
बाइनरी सर्च तब किया जा सकता है जब डेटा अद्वितीय हो, क्या मैं सही हूं? यद्यपि आपने उल्लेख किया है कि न्यूनतम कार्डिनैलिटी महत्वपूर्ण है, एल्गोरिथ्म एक सरल द्विआधारी खोज नहीं होगा, यह कैसे सन्निकटन (~ log2 n) प्रक्रिया समय को प्रभावित करेगा?
शैम्पू

9
@AbhishekShivkumar: बहुत अच्छा सवाल! मुझे लगता है कि सूचकांक तालिका में उतनी ही पंक्तियाँ होंगी जितनी कि डेटा तालिका में हैं। और जैसा कि इस क्षेत्र में केवल 2 मान होंगे (सही / गलत के साथ बूलियन) और कहते हैं कि आप मान के साथ एक रिकॉर्ड चाहते हैं, तो आप केवल पहले पास में सेट किए गए परिणाम को आधा कर सकते हैं, दूसरे पास में आपके सभी रिकॉर्ड का मूल्य सही है। अंतर करने का कोई आधार नहीं है, अब आपको रैखिक फैशन में डेटा तालिका की खोज करनी है, इसलिए उन्होंने कहा कि अनुक्रमित कॉलम को तय करते समय कार्डिनैलिटी पर विचार किया जाना चाहिए। इस मामले में, इस तरह के कॉलम पर अनुक्रमण करना बेकार है। आशा है कि मैं सही हूँ :)
सौरभ पाटिल

7
औसत मामले में ब्लॉक एक्सेस की संख्या नहीं होनी चाहिए (N+1)/2। यदि हम सभी संभावित मामलों के लिए ब्लॉक एक्सेस की संख्या को जोड़ते हैं, और इसे मामलों की संख्या से विभाजित करते हैं, तो हमारे पास N*(N+1)/(2*n)जो होना है, वह होता है (N+1)/2
अजय

31
मुझे लगता है कि इस जवाब में कुछ टाइपो हैं, उदाहरण के लिए, वाक्य में: "गैर-अनुक्रमित तालिका द्वारा आवश्यक 277,778 ब्लॉक अभिगम से बहुत दूर रोना।" क्या लेखक का मतलब 1,000,000 ब्लॉक एक्सेस नहीं है? 277,778 सूचकांक द्वारा आवश्यक ब्लॉकों की संख्या है। लगता है अन्य अशुद्धि का एक जोड़ा भी है :(
jcm

5
@jcm उन्होंने इसे "इंडेक्सिंग सेक्शन क्या है" में समझाया - "इंडेक्सिंग कई फ़ील्ड्स पर कई रिकॉर्ड सॉर्ट करने का एक तरीका है। एक टेबल पर एक फ़ील्ड पर इंडेक्स बनाने से एक और डेटा स्ट्रक्चर बनता है जो फील्ड वैल्यू, और पॉइंटर को होल्ड करता है। इस रिकॉर्ड से संबंधित है। इस सूचकांक संरचना को तब क्रमबद्ध किया जाता है, जिससे बाइनरी सर्च को इस पर प्रदर्शन करने की अनुमति मिलती है। "
ग्रिंच

292

क्लासिक उदाहरण "पुस्तकों में सूचकांक"

1000 पृष्ठों की "पुस्तक" पर विचार करें, 10 अध्याय द्वारा विभाजित, 100 पृष्ठों के साथ प्रत्येक अनुभाग।

सरल, हुह?

अब, कल्पना कीजिए कि आप एक विशेष अध्याय ढूंढना चाहते हैं जिसमें " अल्केमिस्ट " शब्द हो । इंडेक्स पेज के बिना, आपके पास पूरी पुस्तक / अध्यायों के माध्यम से स्कैन करने के अलावा कोई अन्य विकल्प नहीं है। यानी: 1000 पेज।

इस सादृश्य को डेटाबेस की दुनिया में "पूर्ण तालिका स्कैन" के रूप में जाना जाता है।

यहां छवि विवरण दर्ज करें

लेकिन एक इंडेक्स पेज के साथ, आप जानते हैं कि कहां जाना है! और अधिक, किसी भी विशेष अध्याय को देखने के लिए जो मायने रखता है, आपको बस हर बार, फिर से और फिर से इंडेक्स पेज पर देखने की जरूरत है। मिलान सूचकांक को खोजने के बाद आप बाकी को छोड़ कर कुशलतापूर्वक उस अध्याय पर जा सकते हैं।

लेकिन फिर, वास्तविक 1000 पृष्ठों के अलावा, आपको सूचक दिखाने के लिए एक और ~ 10 पृष्ठों की आवश्यकता होगी, इसलिए पूरी तरह से 1010 पृष्ठ।

इस प्रकार, सूचकांक एक अलग खंड है जो कुशल लुक-अप के लिए अनुक्रमित क्रम में अनुक्रमित पंक्ति + सूचक के मूल्यों को संग्रहीत करता है।

स्कूलों में चीजें सरल हैं, है ना? : पी


23
वास्तव में अच्छा सादृश्य! अजीब बात है कि मैं एक पुस्तक सूचकांक और एक db सूचकांक के बीच संबंध नहीं बनाता था
Yolo Voe

2
यह मुझे लगता है Libraryया Grocery Store क्या आप किराने की दुकान पर एक सूचकांक नहीं होने की छवि बना सकते हैं? Where's The Beef?!? Oh its next to the Restrooms, a mop, and makeup
JayRizzo

3
"लेकिन शुरुआत में एक इंडेक्स पेज के साथ, आप वहां हैं।" "आप वहाँ हैं" क्या मतलब है?
फ्रिसबेटेरियन

2
आमतौर पर इंडेक्स पुस्तकों के पीछे जाते हैं, जबकि सामग्री की एक तालिका सामने की ओर जाती है। लेकिन, यह उपमा को और भी बेहतर बनाता है, क्योंकि स्तंभ क्रम कोई मायने नहीं रखता।
3

1
आपका स्पष्टीकरण लेना आसान है। अन्य लोग चीजों को समझाने के लिए परिष्कृत शब्दों का उपयोग करते हैं। काश मैं एक से अधिक उत्थान दे पाता।
पन्नाधाय जू

239

जब मैंने पहली बार इसे पढ़ा तो यह मेरे लिए बहुत उपयोगी था। धन्यवाद।

तब से मैंने इंडेक्स बनाने के नकारात्मक पहलू के बारे में कुछ जानकारी प्राप्त की: यदि आप एक इंडेक्स के साथ एक टेबल ( UPDATEया INSERT) में लिखते हैं, तो आपके पास फ़ाइल सिस्टम में वास्तव में दो राइटिंग ऑपरेशन हैं। टेबल डेटा के लिए एक और इंडेक्स डेटा के लिए एक और (इसका सहारा लेना (और - यदि क्लस्टर किया गया - टेबल डेटा का सहारा लेना))। यदि टेबल और इंडेक्स एक ही हार्ड डिस्क पर स्थित हैं, तो यह अधिक समय खर्च करता है। इस प्रकार एक सूचकांक (एक ढेर) के बिना एक मेज, जल्दी से लिखने के संचालन के लिए अनुमति देगा। (यदि आपके पास दो अनुक्रमणिका हैं तो आप तीन लिखने के संचालन के साथ समाप्त हो जाएंगे, और इसी तरह)

हालांकि, सूचकांक डेटा और टेबल डेटा के लिए दो अलग-अलग हार्ड डिस्क पर दो अलग-अलग स्थानों को परिभाषित करना समय की बढ़ती लागत की समस्या को कम / समाप्त कर सकता है। इसके लिए वांछित हार्ड डिस्क पर फ़ाइलों के अनुसार अतिरिक्त फ़ाइल समूहों की परिभाषा और वांछित के रूप में तालिका / सूचकांक स्थान की परिभाषा की आवश्यकता होती है।

इंडेक्स के साथ एक और समस्या समय के साथ उनका विखंडन है क्योंकि डेटा डाला जाता है। REORGANIZEमदद करता है, आप इसे करने के लिए दिनचर्या लिखना होगा।

कुछ परिदृश्यों में एक ढेर इंडेक्स वाली तालिका की तुलना में अधिक उपयोगी है,

उदाहरण: - यदि आपके पास बहुत से प्रतिद्वंद्वी लिख रहे हैं, लेकिन रिपोर्टिंग के लिए केवल एक रात में व्यावसायिक घंटों के बाहर पढ़ा जाता है।

इसके अलावा, गुच्छेदार और गैर-संकुल अनुक्रमणिका के बीच एक अंतर बल्कि महत्वपूर्ण है।

मेरी मदद की: - क्लस्टर्ड और नॉन क्लस्टर्ड इंडेक्स का वास्तव में क्या मतलब है?


3
मुझे लगता है, इन अनुक्रमण मुद्दों को दो अलग-अलग डेटाबेस को बनाए रखने से हल किया जा सकता है, जैसे मास्टर और दास। जहां रिकॉर्ड्स डालने या अपडेट करने के लिए मास्टर का उपयोग किया जा सकता है। अनुक्रमण के बिना। और गुलाम को सही अनुक्रमण के साथ पढ़ने के लिए इस्तेमाल किया जा सकता है ???
भावेश

14
नहीं, गलत है, क्षमा करें। न केवल तालिकाओं की सामग्री को अद्यतन किया जाना चाहिए, बल्कि सूचकांक संरचना और सामग्री (बी-ट्री, नोड्स) भी होनी चाहिए। गुरु और दास की आपकी अवधारणा यहाँ कोई अर्थ नहीं रखती है। हालांकि दूसरे डेटाबेस पर प्रतिकृति या मिररिंग करना संभव हो सकता है, जिस पर एनालिटिक्स उस डेटाबेस को पहले डेटाबेस से दूर ले जाता है। वह दूसरा डेटाबेस उस डेटा पर डेटा और इंडेक्स की प्रतियां रखेगा ।
डेर यू

3
हां ...! मेरी टिप्पणी को पढ़ने और इसे ठीक से समझने की कोशिश करें। मैंने भी यही कहा, मैंने मास्टर और स्लेव (जो भी) के रूप में संदर्भित किया "एक दूसरे डेटाबेस को eplicating या मिररिंग किया, जिस पर एनालिटिक्स उस डेटाबेस को पहले डेटाबेस से दूर ले जाता है। दूसरा डेटाबेस डेटा और इंडेक्स की प्रतियों को रखेगा। उस डेटा "
भावेश

6
दूसरा डेटाबेस - जिसमें मिररिंग या रेप्लिकेटिंग किया जाता है, गुलाम - पहले एक के रूप में सभी डेटा हेरफेर का अनुभव करेगा। प्रत्येक डीएमएल-ऑपरेशन के साथ उस दूसरे डेटाबेस पर अनुक्रमणिका "इन अनुक्रमण मुद्दों" का अनुभव करेगी। मुझे इसमें वह लाभ नहीं दिख रहा है, जहाँ कभी अनुक्रमणिका की आवश्यकता होती है और त्वरित विश्लेषण के लिए निर्मित होती है जिसे उन्हें अद्यतित रखने की आवश्यकता होती है।
डेर यू

230

एक सूचकांक सिर्फ एक डेटा संरचना है जो डेटाबेस में किसी विशिष्ट स्तंभ के लिए खोज को तेज़ बनाता है। यह संरचना आमतौर पर एक बी-ट्री या हैश टेबल है लेकिन यह किसी अन्य तर्क संरचना हो सकती है।


28
इस उत्तर के लिए एक मिलियन का 1 गुना, जैसा कि मैंने यह लिस्टिंग पाया एक साधारण स्पष्टीकरण खोजने की कोशिश करते हुए कि क्या अनिवार्य रूप से अनुक्रमित है।
जोश बर्सन

1
आइए ध्यान दें कि "सिर्फ एक डेटा संरचना" का अर्थ "डेटा के लिए अतिरिक्त" नहीं है। कुछ समय यह है (उदाहरण के लिए "गैर-संकुल सूचकांक"), कुछ बार यह डेटा के लेआउट को निर्धारित करता है (उदाहरण के लिए "क्लस्टर अनुक्रमित")।
पाब्लो एच

159

अब, मान लें कि हम 'एबीसी' नाम वाले किसी भी कर्मचारी के सभी विवरणों को खोजने के लिए एक क्वेरी चलाना चाहते हैं?

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

सूचकांक के बिना क्या होगा?

डेटाबेस सॉफ्टवेयर का शाब्दिक अर्थ कर्मचारी तालिका में हर एक पंक्ति को देखना होगा कि क्या उस पंक्ति के लिए Employee_Name 'Abc' है। और, क्योंकि हम इसके अंदर 'एबक' नाम के साथ हर पंक्ति चाहते हैं, हम सिर्फ एक बार देखना बंद नहीं कर सकते हैं क्योंकि हम 'एबीसी' नाम के साथ सिर्फ एक पंक्ति पाते हैं, क्योंकि एबीसी नाम के साथ अन्य पंक्तियां हो सकती हैं । इसलिए, हर पंक्ति को अंतिम पंक्ति तक खोजा जाना चाहिए - जिसका अर्थ है कि इस परिदृश्य में हजारों पंक्तियों को डेटाबेस में 'एबीसी' नाम से पंक्तियों को खोजने के लिए जांचना होगा। इसे ही पूर्ण टेबल स्कैन कहा जाता है

डेटाबेस इंडेक्स प्रदर्शन को कैसे मदद कर सकता है

एक सूचकांक होने का पूरा बिंदु एक तालिका में रिकॉर्ड / पंक्तियों की संख्या को अनिवार्य रूप से काटकर खोज प्रश्नों को गति देना है, जिनकी जांच करने की आवश्यकता है। एक सूचकांक एक डेटा संरचना (आमतौर पर एक बी-ट्री) है जो एक तालिका में एक विशिष्ट स्तंभ के लिए मूल्यों को संग्रहीत करता है।

बी-ट्रीज़ इंडेक्स कैसे काम करता है?

कारण बी- पेड़ इंडेक्स के लिए सबसे लोकप्रिय डेटा संरचना है इस तथ्य के कारण है कि वे समय कुशल हैं - क्योंकि लुक-अप, विलोपन और सम्मिलन सभी को लघुगणकीय समय में किया जा सकता है। और, एक और प्रमुख कारण B- पेड़ों का अधिक उपयोग किया जाता है क्योंकि B- ट्री के अंदर संग्रहीत डेटा को सॉर्ट किया जा सकता है। RDBMS आमतौर पर यह निर्धारित करता है कि वास्तव में किस डेटा संरचना का उपयोग किसी इंडेक्स के लिए किया जाता है। लेकिन, कुछ परिदृश्यों में कुछ RDBMS के साथ, आप वास्तव में निर्दिष्ट कर सकते हैं कि आप अपने डेटाबेस का उपयोग करते समय कौन सा डेटा स्ट्रक्चर चाहते हैं।

हैश टेबल इंडेक्स कैसे काम करता है?

हैश इंडेक्स का उपयोग इसलिए किया जाता है क्योंकि हैश टेबल बेहद कुशल होते हैं जब यह केवल मूल्यों को देखने के लिए आता है। तो, एक स्ट्रिंग की समानता के लिए तुलना करने वाले क्वेरीज़ मानों को बहुत तेज़ी से प्राप्त कर सकते हैं यदि वे हैश इंडेक्स का उपयोग करते हैं।

उदाहरण के लिए, जिस क्वेरी की हमने पहले चर्चा की, वह Employee_Name कॉलम पर बनाए गए हैश इंडेक्स से लाभान्वित हो सकती है। जिस तरह से एक हैश इंडेक्स काम करेगा वह यह है कि कॉलम वैल्यू हैश टेबल में कुंजी होगी और उस कुंजी पर मैप किया गया वास्तविक मूल्य टेबल में मौजूद पंक्ति डेटा का एक संकेतक होगा। चूंकि हैश टेबल मूल रूप से एक साहचर्य सरणी है, इसलिए एक विशिष्ट प्रविष्टि "एबीसी => 0x28939 is की तरह दिखाई देगी, जहां 0x28939 तालिका पंक्ति का संदर्भ है जहां एबीसी मेमोरी में संग्रहीत है। हैश टेबल इंडेक्स में "एबीसी" जैसे मान को देखना और स्मृति में पंक्ति का संदर्भ प्राप्त करना स्पष्ट रूप से कर्मचारी के नाम स्तंभ में "एबीसी" के मूल्य के साथ सभी पंक्तियों को खोजने के लिए तालिका को स्कैन करने की तुलना में बहुत तेज है।

हैश इंडेक्स का नुकसान

हैश टेबल डेटा संरचनाओं को सॉर्ट नहीं किया जाता है, और कई प्रकार के प्रश्न हैं जो हैश इंडेक्स भी मदद नहीं कर सकते हैं। उदाहरण के लिए, मान लीजिए कि आप उन सभी कर्मचारियों का पता लगाना चाहते हैं, जिनकी आयु 40 वर्ष से कम है। आप हैश टेबल इंडेक्स के साथ ऐसा कैसे कर सकते हैं? खैर, यह संभव नहीं है क्योंकि एक हैश टेबल केवल महत्वपूर्ण मूल्य जोड़े को देखने के लिए अच्छा है - जिसका अर्थ है कि समानता के लिए जांच करने वाले प्रश्न

डेटाबेस सूचकांक के अंदर वास्तव में क्या है? तो, अब आप जानते हैं कि एक तालिका में एक स्तंभ पर एक डेटाबेस इंडेक्स बनाया जाता है, और यह कि सूचकांक उस विशिष्ट कॉलम में मूल्यों को संग्रहीत करता है। लेकिन, यह समझना महत्वपूर्ण है कि एक डेटाबेस इंडेक्स मानों को उसी तालिका के अन्य स्तंभों में संग्रहीत नहीं करता है। उदाहरण के लिए, यदि हम Employee_Name कॉलम पर एक इंडेक्स बनाते हैं, तो इसका मतलब है कि Employee_Age और Employee_Address कॉलम मान भी इंडेक्स में संग्रहीत नहीं हैं। यदि हमने इंडेक्स में अन्य सभी कॉलम को स्टोर किया है, तो यह पूरी टेबल की एक और कॉपी बनाने जैसा होगा - जो कि बहुत अधिक जगह ले जाएगा और बहुत ही अकुशल होगा।

एक सूचकांक का उपयोग करने के लिए एक डेटाबेस को कैसे पता चलता है? जब "चयन करें * कर्मचारी से जहां कर्मचारी ए 'नाम =' एबीसी 'चलाया जाता है, तो डेटाबेस यह देखने के लिए जांच करेगा कि क्या कॉलम (ओं) पर कोई इंडेक्स है या नहीं। Employee_Name कॉलम को मानकर उस पर एक इंडेक्स बनाया गया है, डेटाबेस को यह तय करना होगा कि क्या यह वास्तव में खोजे जा रहे मूल्यों को खोजने के लिए इंडेक्स का उपयोग करने के लिए समझ में आता है - क्योंकि कुछ परिदृश्य हैं जहां यह वास्तव में डेटाबेस इंडेक्स का उपयोग करने के लिए कम कुशल है , और अधिक कुशल बस पूरी मेज को स्कैन करने के लिए।

डेटाबेस इंडेक्स होने की लागत क्या है?

यह स्थान लेता है - और आपकी तालिका जितनी बड़ी होगी, आपका सूचकांक उतना बड़ा होगा। अनुक्रमणिका के साथ एक और प्रदर्शन हिट तथ्य यह है कि जब भी आप संबंधित तालिका में पंक्तियों को जोड़ते हैं, हटाते हैं, या अपडेट करते हैं, तो वही कार्य आपके अनुक्रमणिका को करना होगा। याद रखें कि एक इंडेक्स में मिनट डेटा तक समान होने की आवश्यकता होती है क्योंकि टेबल कॉलम (ओं) में जो कुछ भी शामिल है वह इंडेक्स कवर करता है।

एक सामान्य नियम के रूप में, एक इंडेक्स केवल एक टेबल पर बनाया जाना चाहिए, यदि इंडेक्स किए गए कॉलम में डेटा अक्सर क्वियर किया जाएगा।

यह सभी देखें

  1. आमतौर पर कौन से कॉलम अच्छे इंडेक्स बनाते हैं?
  2. डेटाबेस इंडेक्स कैसे काम करते हैं

4
"एक डेटाबेस इंडेक्स अन्य कॉलम में मानों को संग्रहीत नहीं करता है" - सच नहीं है।
मस्टीको

2
@mustaccio: इंडेक्स केवल इंडेक्स किए गए कॉलम के साथ पंक्ति का संदर्भ संग्रहीत करता है (जहां तक ​​मुझे पता है)। मैं गलत हो सकता हूं। क्या आपके पास कोई संदर्भ है जो कहता है कि सूचकांक अन्य कॉलम मूल्यों को संग्रहीत करता है?
सोमनाथ मुलुक

3
@To डाउनवोटर्स: क्या आप केवल यह बता सकते हैं कि क्या गलत है ताकि मैं सुधार कर सकूं?
सोमनाथ मुलुक

2
उदाहरण के लिए जाँच करें SQL सर्वर क्लस्टरिंग इंडेक्स या DB2 का CREATE INDEX ... INCLUDEक्लॉज। मेरे विचार से आपके उत्तर में बहुत अधिक सामान्यीकरण हैं।
१२:१६

11
@mustaccio: इसलिए डिफ़ॉल्ट रूप से create indexइसमें अन्य कॉलम शामिल नहीं हैं और यह क्यों होना चाहिए। If we did just store all the other columns in the index, then it would be just like creating another copy of the entire table, which would take up way too much space and would be very inefficient.। यह अनुक्रमित का अधिक सामान्यीकृत संस्करण है। CREATE INDEX ... INCLUDEअन्य कॉलमों पर विचार करके नया संस्करण है। मैंने जो पोस्ट समझाया है वह अधिक सामान्यीकृत संस्करण पर विचार कर रहा है। यदि हम सभी डेटाबेस पर विचार करते हैं, तो अनुक्रमणिका कैसे काम करती है? है ना? क्या आपको लगता है कि उत्तर देने योग्य है?
सोमनाथ मुलुक

96

सरल विवरण!

सूचकांक एक डेटा संरचना के अलावा और कुछ नहीं है जो किसी तालिका में किसी विशिष्ट स्तंभ के लिए मान संग्रहीत करता है । एक तालिका के एक स्तंभ पर एक सूचकांक बनाया जाता है।

उदाहरण: हम नामक एक डेटाबेस तालिका है Userतीन स्तंभों के साथ - Name, Ageऔर Address। मान लें कि दUser तालिका में हजारों पंक्तियाँ हैं।

अब, मान लें कि हम 'जॉन' नाम के किसी भी उपयोगकर्ता के सभी विवरणों को खोजने के लिए एक क्वेरी चलाना चाहते हैं। यदि हम निम्नलिखित क्वेरी चलाते हैं:

SELECT * FROM User 
WHERE Name = 'John'

डेटाबेस सॉफ्टवेयर का शाब्दिक रूप से हर एक पंक्ति को देखना होगा User तालिका के को देखना है Nameकि क्या यह पंक्ति 'जॉन' है। इसमें लंबा समय लगेगा।

यह वह जगह है जहाँ indexहमारी मदद करता है: सूचकांक का उपयोग खोज क्वेरी को तेजी से करने के लिए किया जाता है, एक तालिका में रिकॉर्ड / पंक्तियों की संख्या को अनिवार्य रूप से काटकर जांच की जानी चाहिए

कैसे एक सूचकांक बनाने के लिए:

CREATE INDEX name_index
ON User (Name)

एक तालिका से स्तंभ मान (जैसे: जॉन)index होते हैं , और वे मान एक डेटा संरचना में संग्रहीत होते हैं ।

इसलिए अब डेटाबेस जॉन नाम के कर्मचारियों को खोजने के लिए सूचकांक का उपयोग करेगा, क्योंकि सूचकांक उपयोगकर्ता के नाम से वर्णानुक्रम में क्रमबद्ध होगा। और, क्योंकि यह सॉर्ट किया गया है, इसका मतलब है कि एक नाम की खोज बहुत तेज़ है क्योंकि "J" से शुरू होने वाले सभी नाम इंडेक्स में एक दूसरे के ठीक बगल में होंगे!


1
एक सूचकांक स्तंभ पर क्रमबद्ध क्रमबद्ध नहीं करता है
oligofren

4
धन्यवाद। इससे मेरी समझ में मदद मिली। तो मूल रूप से एक सूचकांक स्तंभ डेटा का एक प्रतिकृति है जिसे सॉर्ट किया गया है। आम तौर पर कॉलम डेटा सिर्फ उसी क्रम में होता है जिस क्रम में डेटा डाला गया था।
नील

34

बस एक त्वरित सुझाव .. जैसा कि अनुक्रमण आपको अतिरिक्त लेखन और भंडारण स्थान की लागत देता है, इसलिए यदि आपके एप्लिकेशन को अधिक इंसर्ट / अपडेट ऑपरेशन की आवश्यकता है, तो आप बिना अनुक्रमणिका के तालिकाओं का उपयोग करना चाह सकते हैं, लेकिन यदि इसके लिए अधिक डेटा पुनर्प्राप्ति संचालन की आवश्यकता है, तो आपको अनुक्रमित के लिए जाना चाहिए तालिका।


6
यह एक टिप्पणी है, एक जवाब नहीं है।
रॉनजॉन

5
यह अधिक दृश्यमान है और इस प्रकार यह अधिक सहायक है क्योंकि यह एक सामान्य टिप्पणी है। टिप्पणी के रूप में कौन सा उत्तर जोड़ा जाना चाहिए था?
pfabri

1
शायद ओपी पर एक टिप्पणी
मर्दाना

33

बस डेटाबेस इंडेक्स को एक पुस्तक के सूचकांक के रूप में सोचें।

यदि आपके पास कुत्तों के बारे में एक पुस्तक है और आप जर्मन शेफर्ड के बारे में एक जानकारी प्राप्त करना चाहते हैं, तो आप निश्चित रूप से पुस्तक के सभी पृष्ठों के माध्यम से फ्लिप कर सकते हैं और पा सकते हैं कि आप क्या देख रहे हैं - लेकिन यह निश्चित रूप से समय लेने वाला है और नहीं बहुत तेज़।

एक अन्य विकल्प यह है कि, आप बस पुस्तक के इंडेक्स सेक्शन में जा सकते हैं और फिर जो आप देख रहे हैं उस इकाई का नाम (इस उदाहरण में, जर्मन शेफर्ड) का उपयोग करके आप जो भी देख रहे हैं, उसे पा सकते हैं और पृष्ठ संख्या को भी देख सकते हैं जल्दी से तुम क्या देख रहे हो।

डेटाबेस में, पृष्ठ संख्या को एक पॉइंटर के रूप में संदर्भित किया जाता है जो डेटाबेस को उस डिस्क पर पते पर निर्देशित करता है जहां इकाई स्थित है। उसी जर्मन शेफर्ड सादृश्य का उपयोग करते हुए, हम कुछ ऐसा कर सकते हैं ("जर्मन शेफर्ड", 0x77129) जहां0x77129 डिस्क पर पता है जहां जर्मन शेफर्ड के लिए पंक्ति डेटा संग्रहीत है।

संक्षेप में, एक सूचकांक एक डेटा संरचना है जो एक विशिष्ट स्तंभ के लिए मानों को तालिका में संग्रहीत करता है ताकि क्वेरी खोज को गति मिल सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.