डायनेमोडीबी में स्थानीय और वैश्विक सूचकांक के बीच अंतर


129

मैं इन दो माध्यमिक अनुक्रमों और उनके बीच अंतर के बारे में उत्सुक हूं। यह कल्पना करना कठिन है कि यह कैसा दिखता है। और मुझे लगता है, यह सिर्फ मुझसे ज्यादा लोगों की मदद करेगा।


1
डायनमोबी एफएक्यू में उत्तर दिया गया । के लिए खोज "कैसे वैश्विक माध्यमिक अनुक्रमित स्थानीय माध्यमिक अनुक्रमित से भिन्न क्यों है?"
मार्कशीट

1
अब FAQ से खोजना इतना आसान नहीं है। शायद यह पुनर्गठित है
बिनिथ

तुलनात्मक तालिका के साथ आधिकारिक AWS डॉक: docs.aws.amazon.com/en_pv/amazondynamodb/latest/developerguide/… docs.aws.amazon.com/en_pv/amazondynamodb/latest/developerguide/…
radistao

जवाबों:


114

स्थानीय माध्यमिक सूचकांक अभी भी मूल हैश की पर निर्भर हैं। जब आप हैश + रेंज के साथ एक टेबल की आपूर्ति करते हैं, तो LSI के बारे में हैश + रेंज 1, हैश + रेंज 2 .. हैश + रेंज 6 के बारे में सोचें। आपको क्वेरी करने के लिए 5 और श्रेणी विशेषताएँ मिलती हैं। इसके अलावा, केवल एक प्रावधान थ्रूपुट है।

वैश्विक माध्यमिक सूचकांक एक नए प्रतिमान को परिभाषित करता है - प्रति सूचकांक अलग-अलग हैश / रेंज कुंजी।
यह प्रति तालिका एक हैश कुंजी के मूल उपयोग को तोड़ता है। यही कारण है कि जीएसआई को परिभाषित करते समय आपको प्रति इंडेक्स प्रति प्रोविज़न थ्रूपुट जोड़ने और इसके लिए भुगतान करने की आवश्यकता होती है।

मतभेदों के बारे में अधिक विस्तृत जानकारी जीएसआई की घोषणा में पाई जा सकती है


2
1 जोड़ना चाहते हैं) माध्यमिक सूचकांक, चाहे LSI या GSI, विशिष्टता के साथ कुछ नहीं करना है
user1322092

1
आपको 5 स्थानीय माध्यमिक सूचक तक की अनुमति है, यही कारण है कि चेन हरेल कहते हैं "आपको क्वेरी करने के लिए 5 और रेंज विशेषताएँ मिलती हैं"
फेलिप अल्वारेज़

93

यहाँ प्रलेखन से औपचारिक परिभाषा है:

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

स्थानीय माध्यमिक सूचकांक - एक सूचकांक जिसमें तालिका के समान हैश कुंजी होती है, लेकिन एक अलग श्रेणी की कुंजी होती है। एक स्थानीय माध्यमिक सूचकांक इस अर्थ में "स्थानीय" होता है कि स्थानीय माध्यमिक सूचकांक के प्रत्येक विभाजन को एक तालिका विभाजन में स्कोप किया जाता है जिसमें समान हैश कुंजी होती है।

हालांकि, अंतर महत्वपूर्ण परिभाषाओं के संदर्भ में संभावनाओं से परे हैं। नीचे कुछ महत्वपूर्ण कारक खोजें जो अनुक्रमणिका को बनाए रखने के लिए लागत और प्रयास को सीधे प्रभावित करेंगे:

  • थ्रूपुट:

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

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

* ग्लोबल सेकेंडरी इंडेक्स के लिए प्रावधानित थ्रूपुट को परिभाषित करते समय, सुनिश्चित करें कि आप निम्नलिखित आवश्यकताओं पर विशेष ध्यान देते हैं:

एक तालिका लिखने के लिए सफल होने के लिए, तालिका के लिए प्रावधानित थ्रूपुट सेटिंग्स और उसके सभी वैश्विक माध्यमिक अनुक्रमकों में लेखन को समायोजित करने के लिए पर्याप्त लेखन क्षमता होनी चाहिए; अन्यथा, तालिका में लिखा जाना थ्रॉटल हो जाएगा।

  • प्रबंधन:

स्थानीय माध्यमिक सूचकांक केवल तब बनाया जा सकता है जब आप तालिका बना रहे हों, स्थानीय माध्यमिक सूचकांक को मौजूदा तालिका में जोड़ने का कोई तरीका नहीं है, एक बार जब आप सूचकांक बनाते हैं तो आप इसे हटा नहीं सकते।

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

  • संगति पढ़ें:

स्थानीय माध्यमिक इंडेक्स अंतिम या मजबूत स्थिरता का समर्थन करता है, जबकि ग्लोबल सेकेंडरी इंडेक्स केवल अंतिम स्थिरता का समर्थन करता है।

  • प्रोजेक्शन:

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

माध्यमिक सूचियों में परिभाषित कीज़ की विशिष्टता के बारे में विशेष विचार:

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

स्रोत: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html


1
" ग्लोबल सेकेंडरी इंडेक्स का अपना प्रावधान थ्रूपुट है, जब आप इंडेक्स को क्वेरी करते हैं तो ऑपरेशन टेबल से रीड की क्षमता का उपभोग करेगा " - गलत। वैश्विक माध्यमिक इंडेक्स पर क्वेरी या स्कैन इंडेक्स से क्षमता इकाइयों का उपभोग करते हैं, बेस टेबल से नहीं।
ethanxyz_0

1
@bsd यह एक प्रमुख सीमा के बारे में एक नोट जोड़ने के लिए समझ में आता है कि LSI के उपयोग का उपयोग करता है: "स्थानीय माध्यमिक अनुक्रमित तालिकाओं के लिए, विभाजन कुंजी मूल्य प्रति 10 GB आकार की सीमा है। स्थानीय माध्यमिक अनुक्रमित के साथ एक तालिका संग्रहीत कर सकते हैं। आइटमों की संख्या, जब तक कि किसी एक विभाजन कुंजी मूल्य के लिए कुल आकार 10 जीबी से अधिक न हो। " ( docs.aws.amazon.com/amazondynamodb/latest/developerguide/… )
wvdz

29

ये सूचकांक द्वारा संभावित खोजें हैं:

  • हाश द्वारा
  • हैश + रेंज द्वारा
  • हैश + लोकल इंडेक्स द्वारा
  • ग्लोबल इंडेक्स द्वारा
  • ग्लोबल इंडेक्स + रेंज इंडेक्स द्वारा

टेबल की हैश और रेंज इंडेक्स: ये अमेज़न के एडब्ल्यूएस एसडीके के पिछले संस्करणों के सामान्य इंडेक्स हैं।

ग्लोबल और लोकल इंडेक्स: ये टेबल के मौजूदा हैश और रेंज इंडेक्स के अलावा टेबल पर बनाए गए 'अतिरिक्त' इंडेक्स होते हैं। वैश्विक सूचकांक हैश के समान है। सीमा सूचकांक तालिका के हैश के साथ उपयोग किए जाने वाले रेंज इंडेक्स के समान व्यवहार करता है। आपके कोड में इकाई मॉडल में, गेट्टर को इस तरह से एनोटेट किया जाना चाहिए:

  • वैश्विक सूचकांक के लिए:

    @DynamoDBIndexHashKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_USER)
    public String getUser() {
        return user;
    }
    
  • वैश्विक सूचकांक से संबंधित रेंज इंडेक्स के लिए:

    @DynamoDBIndexRangeKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_TIMESTAMP)
    public String getTimestamp() {
        return timestamp;
    }
    

इसके अलावा, यदि आप एक वैश्विक सूचकांक द्वारा एक तालिका पढ़ते हैं, तो यह अंततः पढ़ा जाना चाहिए (लगातार पढ़ा नहीं जाना चाहिए):

queryExpression.setConsistentRead(false);

20

इसे लगाने का एक तरीका यह है:

LSI - आपको "फ़िल्टर" करने या क्वेरी को प्रतिबंधित करने के लिए कई अलग-अलग विशेषताओं का उपयोग करते हुए एक एकल हैश-कुंजी पर एक क्वेरी करने की अनुमति देता है।

जीएसआई - आपको एक तालिका में कई हैश-की पर प्रश्न करने की अनुमति देता है, लेकिन परिणामस्वरूप थ्रूपुट में अतिरिक्त खर्च होता है।

तालिका प्रकारों का अधिक व्यापक विघटन और वे कैसे काम करते हैं, नीचे:

हैश ओनली

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

हैश + रेंज

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

यह सोचने का एक और तरीका एक प्रारूप के साथ एक फ़ाइल की तरह है। आपके पास एक ही नाम (हैश) के साथ एक फ़ाइल हो सकती है, एक ही फ़ोल्डर (तालिका) में, जब तक कि उनका प्रारूप (रेंज) अलग नहीं होता। इसी तरह, आपके पास एक ही प्रारूप की कई फाइलें हो सकती हैं जब तक कि उनका नाम अलग है।

LSI

एक LSI मूल रूप से एक Hash-Key + Range-Key के समान है, और आइटम बनाते समय भी यह उसी तरह के नियमों का पालन करता है, सिवाय इसके कि आपको LSI के लिए मान भी प्रदान करना चाहिए, साथ ही; उन्हें खाली / अशक्त नहीं छोड़ा जा सकता है।

एक LSI कहने के लिए "रेंज-की 2" पूरी तरह से सही नहीं है क्योंकि आपके पास (पहले से मेरी फ़ाइल और प्रारूप सादृश्य का उपयोग करके) और एक फ़ाइल का नाम नहीं है: file.format.lsiऔर file.format.lsi2। आप कर सकते हैं, हालांकि, है file.format.lsiऔर file.format2.lsiया file.format.lsiऔर file2.format.lsi

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

जीएसआई

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

इसलिए जीएसआई के लिए, आप fileNameअपने बेस हैश-की, और fileFormatअपनी बेस रेंज-की के रूप में निर्दिष्ट कर सकते हैं । फिर आप एक जीएसआई निर्दिष्ट कर सकते हैं जिसमें एक हैश-की fileName2और रेंज-की है fileFormat2। इसके बाद आप LSI के विपरीत fileNameया fileName2जहाँ आप चाहें पसंद कर सकते हैं, जहाँ आप केवल क्वेरी कर सकते हैंfileName

मुख्य लाभ यह है कि आपको केवल 2 के बजाय एक टेबल को बनाए रखना है, और कभी भी आप या तो प्राथमिक हैश / रेंज या GSI हैश / रेंज (एस) को लिखते हैं, अन्य (ओं) को स्वचालित रूप से भी अपडेट किया जाएगा, इसलिए आप अन्य तालिका (तालिकाएँ) को अपडेट करने के लिए "भूल" नहीं सकते हैं, जैसे आप एक मल्टी-टेबल सेटअप के साथ कर सकते हैं। इसके अलावा, एक को अपडेट करने के बाद और दूसरे को अपडेट करने से पहले खोए कनेक्शन का कोई मौका नहीं है, जैसे कि मल्टी-टेबल सेटअप के साथ है।

इसके अतिरिक्त, एक जीएसआई आधार हैश / रेंज संयोजन को "ओवरलैप" कर सकता है। तो अगर आप के साथ एक मेज बनाना चाहते थे, तो fileNameऔर fileFormatअपने आधार हैश / रेंज और के रूप में filePriorityऔरfileName अपने जीएसआई के रूप में, आप कर सकते हैं।

अंत में, एक जीएसआई हैश + रेंज संयोजन को अद्वितीय होने की आवश्यकता नहीं है, जबकि आधार हैश + रेंज संयोजन को अद्वितीय होना चाहिए। यह कुछ ऐसा है जो दोहरी / बहु तालिका सेटअप के साथ संभव नहीं है, लेकिन जीएसआई के साथ है। नतीजतन, आप अपडेट करते समय आधार और जीएसआई हैश + रेंज दोनों के लिए मान प्रदान करते हैं; इनमें से कोई भी मान रिक्त / शून्य नहीं हो सकता है।


13

समझाने का दूसरा तरीका: LSI आपको उसी हैश की के साथ आइटम पर अतिरिक्त क्वेरी करने में मदद करता है। GSI आपको "तालिका के पार" वस्तुओं पर समान प्रश्न करने में मदद करता है। तो बहुत उपयोगी है।

यदि आपके पास एक उपयोगकर्ता प्रोफ़ाइल तालिका है: अद्वितीय-आईडी, नाम, ईमेल। यहां अगर आपको नाम, ईमेल पर तालिका को क्वेरी करने की आवश्यकता है - तो उन्हें GSI (LSI अभ्यस्त) बनाने का एकमात्र तरीका है:


1

यह डॉक्यूमेंटेशन बहुत अच्छी व्याख्या देता है:

https://aws.amazon.com/blogs/aws/now-available-global-secondary-indexes-for-amazon-dynamodb/

मैं इस प्रश्न पर टिप्पणी नहीं कर सकता था, लेकिन जो लेखन और पढ़ने के प्रदर्शन के मामले में बेहतर है:

(टेबल के साथ स्थानीय सूचकांक 100 का थ्रूपुट पढ़ें और लिखें) या (50 के थ्रूपुट को पढ़ने / लिखने के साथ ग्लोबल इंडेक्स 50 के थ्रूपुट को पढ़ने / लिखने के साथ?)

मुझे अपने उपयोग के मामले के लिए अलग विभाजन कुंजी की आवश्यकता नहीं है, इसलिए आवश्यक कार्यक्षमता के लिए स्थानीय सूचकांक पर्याप्त होना चाहिए।


0

GSI का उपयोग लगातार रीड के लिए नहीं किया जा सकता है।

एलएसआई का उपयोग लगातार रीड के लिए किया जा सकता है लेकिन वे मुख्य विभाजन आकार को 10GB तक सीमित कर देंगे। इसके अलावा LSI केवल टेबल निर्माण पर ही बनाए जा सकते हैं।

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