एक डेटाबेस अनुक्रमणिका


12

मैं डेटाबेस से इतना परिचित नहीं हूं और अब मैं अनुक्रमण तंत्र को समझने की कोशिश कर रहा हूं।

RDBMS में मुझे जो पता है, उससे एक कॉलम पर अनुक्रमण तेजी से उस कॉलम को खोजता है। यह ट्रिपल स्टोर्स के लिए भी सही है, केवल वहाँ सूचकांक मान लेते हैं कि आप (उदाहरण के लिए) विषय के आधार पर खोज करेंगे, फिर ऑब्जेक्ट और इसी तरह।

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

मुझे एक ट्रिपल स्टोर में सभी संभावित अनुक्रमितों को क्यों नहीं जोड़ना चाहिए, और एक आरडीबीएमएस को विस्तारित करना, प्रत्येक स्तंभ पर अनुक्रमणिका क्यों नहीं बनाना (यह मानते हुए कि मैं बहुत आलसी नहीं हूं)?

जवाबों:


25

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

यह विशेष रूप से आवेषण पर ध्यान देने योग्य है। सोचिए अगर आपने एक टेबल पर किया हुआ हर इंसर्ट 20 अन्य टेबलों पर दोहराया जाए। यह धीमी गति से होने वाला है।

ध्यान दें कि यह यौगिक, गुच्छेदार और पूर्ण-पाठ अनुक्रमित के साथ और भी खराब हो जाता है, लेकिन मैं अभी तक आपके लिए समस्या को जटिल नहीं करना चाहता।


2

अनुक्रमणिका मूल रूप से अतिरिक्त डेटा संरचनाएं हैं जिन्हें निर्मित और संग्रहीत किया जाना है। ईन्डे का निर्माण सीपीयू पावर (लेखन कार्य के दौरान) करता है और इसे स्टोर करने से डिस्क क्षमता बर्बाद होती है।

आप उन अनुक्रमितों का निर्माण और भंडारण क्यों करना चाहेंगे जिनका आप कभी उपयोग नहीं करते हैं?


यह विशुद्ध रूप से सैद्धांतिक सवाल है ("क्या अगर / क्यों नहीं")।
ड्रैगोस

@ मुझे लगता है कि उन सवालों का जवाब मेरी पोस्ट से स्पष्ट है: यदि आपने किया, तो हर लेखन ऑपरेशन को बहुत धीमा मिलेगा और हर रिकॉर्ड डिस्क की क्षमता को बर्बाद करेगा। क्यों नहीं? क्योंकि सीपीयू पावर और डिस्क स्टोरेज महंगी होती है।
मत्तोज ज़ाब्स्की

2

जरूरत पड़ने पर ही इंडेक्स लगाएं। जब मैं एक डेटाबेस स्कीमा विकसित कर रहा हूं, तो अंगूठे के एक नियम के रूप में, हर तालिका को शुरू करने के लिए एक पीके प्राथमिक कुंजी क्लस्टर इंडेक्स मिलता है। यह उस तालिका में डेटा के लिए विशिष्ट पहचानकर्ता होगा। 1 कॉलम या कई पर हो सकता है।

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

यह आधार स्कीमा है। जैसे ही एप्लिकेशन विकसित होता है और परिपक्व होता है, हम प्रदर्शन संबंधी चिंताओं के आधार पर अनुक्रमित जोड़ते हैं और हम डेटा को कैसे क्वेरी कर रहे हैं।

जोड़ा गया प्रत्येक सूचकांक स्थानिक उपयोग के साथ-साथ अतिरिक्त रखरखाव को भी जोड़ता है। इसलिए बुद्धिमानी से अपने अनुक्रमित चुनें।


आपके उत्तर को पढ़ते समय, एक और प्रश्न मेरे दिमाग में आया: क्या प्राथमिक कुंजी आमतौर पर स्वचालित रूप से अनुक्रमित होती हैं, या क्या मुझे खुद को निर्दिष्ट करना होगा कि उन्हें अनुक्रमित किया जाएगा? उदाहरण के लिए, MySQL डेटाबेस में कहें?
Dragos

हां, एक प्राथमिक कुंजी को आपके (SQL सर्वर) के लिए स्वचालित रूप से एक संकुल सूचकांक बनाना चाहिए। केवल एक प्राथमिक कुंजी, इस प्रकार प्रति तालिका केवल एक क्लस्टर इंडेक्स। MySQL समान होना चाहिए लेकिन शायद एक MySQL विशेषज्ञ सत्यापन कर सकता है।
जॉन रेन्नोर

2

इंडेक्स की ताकत यह है कि वे 1) एक डेटा संरचना है जिसे जल्दी से और 2 के माध्यम से खोजा जा सकता है) वास्तविक तालिकाओं की तुलना में अधिक कॉम्पैक्ट है, जिससे इंडेक्स का अधिक डिस्क में पेजेड होने के बजाय मेमोरी में फिट होने की अनुमति मिलती है।

यदि आपके पास प्रत्येक कॉलम पर एक इंडेक्स है, तो इंडेक्स स्वयं तालिका का प्रतिनिधित्व करने वाले स्थान से अधिक स्थान लेगा। यदि डेटाबेस वास्तव में सभी अनुक्रमित का उपयोग करता है, तो उसे मेमोरी में अंदर और बाहर स्वैप करने के लिए अधिक समय की आवश्यकता होगी। इसके अलावा, हर इंडेक्स को निष्क्रिय, अपडेट या डिलीट करने पर अपडेट करना होगा।

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

इसलिए हर संभव सूचकांक बनाने के लिए , कम से कम n हैं! एक इंडेक्स में कॉलम को व्यवस्थित करने के तरीके। केवल 5 कॉलम के साथ, 120 संभावित इंडेक्स हैं।

चूंकि बहुत सारे संभावित सूचकांक हैं, इसलिए आपको वास्तव में यह निर्धारित करना होगा कि आपके आवेदन के लिए कौन से सूचकांक उपयोगी हैं और केवल उन्हीं को बनाएं।


लेकिन क्या आपके उदाहरण में दो इंडेक्स होंगे: एक स्कूल पर और दूसरा क्लाययर पर किसी एक मामले में उपयोगी होगा?
ड्रैगोस

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

मेरा क्या मतलब था, अगर मेरे पास स्कूल और क्लीयरयूर पर अलग-अलग इंडेक्स हैं, तो क्या वे उन सभी लोगों की खोज में उपयोगी होंगे जो 1980 और 1984 के बीच कक्षाओं से ड्यूक गए थे?
ड्रेगोज

@ डैग्रोस यह विशिष्ट डीबी इंजन पर निर्भर करता है। उदाहरण के लिए, Postgres एक बिटमैप इंडेक्स स्कैन नामक कुछ का उपयोग करेगा ताकि कई इंडेक्स के परिणामों को अवरुद्ध किया जा सके। यह किस इंजन का उपयोग करना है, यह तय करना क्वेरी इंजन पर निर्भर करता है, और यह हमेशा डीबी विशिष्ट होगा।
क्रिस पिटमैन

2

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

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

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