2012-09-27 9 views
6

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

मैंने इसे पुस्तक के पीछे एक इंडेक्स की तरह समझा है, लेकिन अद्वितीय तत्वों (जैसे उपयोगकर्ता डेटाबेस में ई-मेल पते) के डेटा फ़ील्ड के मामले में, पीछे का उपयोग करके पुस्तक समानता का एक समान रैखिक लुकअप समय एक गैर अनुक्रमित सीच के रूप में प्रदान करेगा।

खोज समय को तेज़ करने के लिए यहां क्या हो रहा है? मैंने B+-Trees का उपयोग करके खोज के बारे में थोड़ा सा पढ़ा है, लेकिन विवरण थोड़ा सा भी थे। जो मैं खोज रहा हूं वह है कि क्या हो रहा है इसका एक उच्च स्तरीय अवलोकन, मेरी वैचारिक समझ में मदद करने के लिए कुछ, तकनीकी विवरण नहीं।

उत्तर

7

ठीक है, अनुसंधान और चर्चा का एक सा के बाद, यहाँ मैं क्या सीखा है है:

वैचारिक एक सूचकांक डेटा फ़ील्ड यह अनुक्रमण है, जहां यह करने के लिए प्रत्येक सूचकांक मूल्य अंक मूल का एक क्रमबद्ध प्रतिलिपि (अवर्गीकृत है) पंक्ति। चूंकि डेटाबेस जानता है कि मूल्यों को कैसे क्रमबद्ध किया जाता है, यह मूल्य से शुरू होने के लिए मूल्य की तलाश करने के बजाय अधिक परिष्कृत खोज एल्गोरिदम लागू कर सकता है। binary search algorithm क्रमबद्ध सूचियों के लिए एक खोज एल्गोरिदम का एक साधारण उदाहरण है और ओ (एन) से ओ (लॉग एन) से अधिकतम खोज समय को कम करता है।

एक पक्ष नोट के रूप में: एक सभ्य छंटाई एल्गोरिथ्म आम तौर पर ले जाएगा O (n n लॉग इन करें) पूरा करने के लिए, जिसका अर्थ है (जैसा कि हम सभी शायद पहले सुना है) आप केवल क्षेत्रों आप अक्सर खोज करेंगे पर अनुक्रमित रखना चाहिए , क्योंकि यह कुछ बार एक पूर्ण खोज करने के लिए सूचकांक (जिसमें एक प्रकार शामिल है) जोड़ने के लिए थोड़ा महंगा है। उदाहरण के लिए, 1,000,000 प्रविष्टियों के बड़े डेटाबेस में यह एक बार खोजने के लिए क्रमशः 20x अधिक महंगा है।

संपादित करें: डिस्क कार्यक्षमताओं से पढ़ने के संबंध में विशेष रूप से खोज क्षमता पर अधिक गहराई से देखने के लिए @ जारोड इलियट के answer देखें।

1

अपने बैक-ऑफ-द-बुक अनुरूपता को जारी रखने के लिए, यदि पृष्ठ उस तत्व के अनुसार क्रमशः एक गैर-अनुक्रमित खोज के समान दिखने वाला समय होगा, हां।

हालांकि, अगर आपकी पुस्तक लेखक द्वारा आदेशित पुस्तक समीक्षाओं की एक सूची थी, लेकिन आप केवल आईएसबीएन को जानते थे। आईएसबीएन अद्वितीय है, हां, लेकिन आपको अभी भी प्रत्येक समीक्षा को स्कैन करना होगा जिसे आप ढूंढ रहे हैं।

अब, आईएसबीएन द्वारा क्रमबद्ध पुस्तक के पीछे एक अनुक्रमणिका जोड़ें। बूम, तेज़ खोज समय। यह इंडेक्स कुंजी (आईएसबीएन) से वास्तविक डेटा पंक्ति में जाने के लिए डेटाबेस इंडेक्स के समान है (इस मामले में आपकी पुस्तक का एक पृष्ठ नंबर)।

+0

यह अभी भी पर्याप्त उत्तर प्रदान नहीं करता है। एक तालिका में चीजों को फ़ील्ड (कॉलम) के रूप में संग्रहीत किया जाता है, इसलिए हम किसी डेटा फ़ील्ड को किसी पुस्तक में अध्याय के रूप में सोच सकते हैं। इसलिए यदि हम पुस्तक के ईमेल अध्याय पर जाते हैं, तो यह अभी भी एक ई-मेल के रूप में देखने के लिए तेज़ है जितना कि यह पुस्तक के सूचकांक में है। हम उस आइटम के लिए पूरी तालिका स्कैन नहीं करते हैं जिसे हम खोजना चाहते हैं ... केवल प्रासंगिक फ़ील्ड। –

+0

तो आप प्रत्येक अध्याय में प्रत्येक पंक्ति के लिए फिर से * सभी * डेटा स्टोर करने का सुझाव दे रहे हैं? इस तरह आपके पास "अंतिम नाम" अध्याय है, जिसे अंतिम नाम से क्रमबद्ध किया गया है, पहला नाम, अंतिम नाम, डीओबी, जन्मस्थान, उपयोगकर्ता नाम, ईमेल, और 1000-शब्द जीवनी सूचीबद्ध है। फिर आपके पास उपयोगकर्ता नाम द्वारा क्रमबद्ध "उपयोगकर्ता नाम" अध्याय है, फिर से पहला नाम, अंतिम नाम, डीओबी, जन्मस्थान, उपयोगकर्ता नाम, ईमेल, और 1000-शब्द जीवनी सूचीबद्ध करना। फिर आपके पास "ईमेल" अध्याय है, ईमेल द्वारा क्रमबद्ध, पहला नाम, अंतिम नाम, डीओबी, जन्मस्थान, उपयोगकर्ता नाम, ईमेल, और एक 1000-शब्द जीवनी सूचीबद्ध है। यह अंतरिक्ष के अत्यधिक अक्षम उपयोग की तरह लगता है ... –

+0

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

19

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

एक बिंदु को चित्रित करने के लिए, मान लें कि सब कुछ डिस्क पर संग्रहीत है। यदि आपको किसी तालिका में कुछ मूल्यों की तलाश करने वाली तालिका में डेटा की प्रत्येक पंक्ति के माध्यम से खोज करने की आवश्यकता है, तो आपको डिस्क से डेटा की पूरी पंक्ति को यह देखने के लिए अभी भी पढ़ने की आवश्यकता है कि यह मेल खाता है - इसे आमतौर पर 'टेबल स्कैन' के रूप में जाना जाता है '।

यदि आपकी तालिका 100 एमबी है, तो यह 100 एमबी है जिसे आपको डिस्क से पढ़ने की आवश्यकता है।

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

डिस्क से 10 एमबी डेटा पढ़ना (और शायद प्रत्येक मैच के लिए पूर्ण पंक्ति डेटा पढ़ने के लिए थोड़ा अतिरिक्त) 100 एमबी पढ़ने से लगभग 10 गुना तेज है।

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

सामान्यतः, यही कारण है कि आप एक छोटे डेटासेट को अनुक्रमणित करने के साथ कोई ठोस अंतर नहीं देख सकते जो आसानी से स्मृति में फिट बैठता है।

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

संबंधित मुद्दे