मैं इन दो माध्यमिक अनुक्रमों और उनके बीच अंतर के बारे में उत्सुक हूं। यह कल्पना करना कठिन है कि यह कैसा दिखता है। और मुझे लगता है, यह सिर्फ मुझसे ज्यादा लोगों की मदद करेगा।
मैं इन दो माध्यमिक अनुक्रमों और उनके बीच अंतर के बारे में उत्सुक हूं। यह कल्पना करना कठिन है कि यह कैसा दिखता है। और मुझे लगता है, यह सिर्फ मुझसे ज्यादा लोगों की मदद करेगा।
जवाबों:
स्थानीय माध्यमिक सूचकांक अभी भी मूल हैश की पर निर्भर हैं। जब आप हैश + रेंज के साथ एक टेबल की आपूर्ति करते हैं, तो LSI के बारे में हैश + रेंज 1, हैश + रेंज 2 .. हैश + रेंज 6 के बारे में सोचें। आपको क्वेरी करने के लिए 5 और श्रेणी विशेषताएँ मिलती हैं। इसके अलावा, केवल एक प्रावधान थ्रूपुट है।
वैश्विक माध्यमिक सूचकांक एक नए प्रतिमान को परिभाषित करता है - प्रति सूचकांक अलग-अलग हैश / रेंज कुंजी।
यह प्रति तालिका एक हैश कुंजी के मूल उपयोग को तोड़ता है। यही कारण है कि जीएसआई को परिभाषित करते समय आपको प्रति इंडेक्स प्रति प्रोविज़न थ्रूपुट जोड़ने और इसके लिए भुगतान करने की आवश्यकता होती है।
मतभेदों के बारे में अधिक विस्तृत जानकारी जीएसआई की घोषणा में पाई जा सकती है
यहाँ प्रलेखन से औपचारिक परिभाषा है:
ग्लोबल सेकेंडरी इंडेक्स - हैश और रेंज की के साथ एक इंडेक्स जो टेबल पर मौजूद लोगों से अलग हो सकता है। एक वैश्विक द्वितीयक सूचकांक को "वैश्विक" माना जाता है क्योंकि सूचकांक पर क्वेरीज़ सभी आंकड़ों को एक तालिका में, सभी विभाजनों में फैला सकती है।
स्थानीय माध्यमिक सूचकांक - एक सूचकांक जिसमें तालिका के समान हैश कुंजी होती है, लेकिन एक अलग श्रेणी की कुंजी होती है। एक स्थानीय माध्यमिक सूचकांक इस अर्थ में "स्थानीय" होता है कि स्थानीय माध्यमिक सूचकांक के प्रत्येक विभाजन को एक तालिका विभाजन में स्कोप किया जाता है जिसमें समान हैश कुंजी होती है।
हालांकि, अंतर महत्वपूर्ण परिभाषाओं के संदर्भ में संभावनाओं से परे हैं। नीचे कुछ महत्वपूर्ण कारक खोजें जो अनुक्रमणिका को बनाए रखने के लिए लागत और प्रयास को सीधे प्रभावित करेंगे:
स्थानीय माध्यमिक सूचकांक तालिका से थ्रूपुट का उपभोग करते हैं। जब आप स्थानीय इंडेक्स के माध्यम से रिकॉर्ड की क्वेरी करते हैं, तो ऑपरेशन टेबल से रीड कैपेसिटी यूनिट का उपभोग करता है। जब आप किसी स्थानीय अनुक्रमणिका वाली तालिका में एक लिखित ऑपरेशन (क्रिएट, अपडेट, डिलीट) करते हैं, तो दो लेखन कार्य होंगे, एक तालिका के लिए दूसरा अनुक्रमणिका के लिए। दोनों ऑपरेशन टेबल से लेखन क्षमता इकाइयों का उपभोग करेंगे।
ग्लोबल सेकेंडरी इंडेक्स का अपना प्रावधान थ्रूपुट होता है, जब आप इंडेक्स को क्वेरी करते हैं तो ऑपरेशन इंडेक्स से रीड की क्षमता का उपभोग करेगा, जब आप एक ग्लोबल ऑपरेशन वाले टेबल में राइट ऑपरेशन (क्रिएट, अपडेट, डिलीट) करते हैं, तो दो होंगे लिखने के संचालन, तालिका के लिए एक और सूचकांक के लिए *।
* ग्लोबल सेकेंडरी इंडेक्स के लिए प्रावधानित थ्रूपुट को परिभाषित करते समय, सुनिश्चित करें कि आप निम्नलिखित आवश्यकताओं पर विशेष ध्यान देते हैं:
एक तालिका लिखने के लिए सफल होने के लिए, तालिका के लिए प्रावधानित थ्रूपुट सेटिंग्स और उसके सभी वैश्विक माध्यमिक अनुक्रमकों में लेखन को समायोजित करने के लिए पर्याप्त लेखन क्षमता होनी चाहिए; अन्यथा, तालिका में लिखा जाना थ्रॉटल हो जाएगा।
स्थानीय माध्यमिक सूचकांक केवल तब बनाया जा सकता है जब आप तालिका बना रहे हों, स्थानीय माध्यमिक सूचकांक को मौजूदा तालिका में जोड़ने का कोई तरीका नहीं है, एक बार जब आप सूचकांक बनाते हैं तो आप इसे हटा नहीं सकते।
जब आप तालिका बनाते हैं और मौजूदा तालिका में जोड़ा जाता है, तो वैश्विक माध्यमिक सूचकांक बनाया जा सकता है, मौजूदा वैश्विक माध्यमिक सूचकांक को हटाने की भी अनुमति है।
स्थानीय माध्यमिक इंडेक्स अंतिम या मजबूत स्थिरता का समर्थन करता है, जबकि ग्लोबल सेकेंडरी इंडेक्स केवल अंतिम स्थिरता का समर्थन करता है।
स्थानीय माध्यमिक सूचकांक उन विशेषताओं को प्राप्त करने की अनुमति देते हैं जो सूचकांक के लिए अनुमानित नहीं हैं (हालांकि अतिरिक्त लागत: प्रदर्शन और खपत क्षमता इकाइयों के साथ)। ग्लोबल सेकेंडरी इंडेक्स के साथ आप केवल इंडेक्स को प्रोजेक्ट की गई विशेषताओं को प्राप्त कर सकते हैं।
माध्यमिक सूचियों में परिभाषित कीज़ की विशिष्टता के बारे में विशेष विचार:
एक स्थानीय माध्यमिक सूचकांक में, सीमा कुंजी मान किसी दिए गए हैश कुंजी मूल्य के लिए अद्वितीय होने की आवश्यकता नहीं है, यही बात ग्लोबल सेकेंडरी इंडेक्स पर भी लागू होती है, प्रमुख मूल्यों (हैश और रेंज) को अद्वितीय होने की आवश्यकता नहीं है।
स्रोत: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html
ये सूचकांक द्वारा संभावित खोजें हैं:
टेबल की हैश और रेंज इंडेक्स: ये अमेज़न के एडब्ल्यूएस एसडीके के पिछले संस्करणों के सामान्य इंडेक्स हैं।
ग्लोबल और लोकल इंडेक्स: ये टेबल के मौजूदा हैश और रेंज इंडेक्स के अलावा टेबल पर बनाए गए 'अतिरिक्त' इंडेक्स होते हैं। वैश्विक सूचकांक हैश के समान है। सीमा सूचकांक तालिका के हैश के साथ उपयोग किए जाने वाले रेंज इंडेक्स के समान व्यवहार करता है। आपके कोड में इकाई मॉडल में, गेट्टर को इस तरह से एनोटेट किया जाना चाहिए:
वैश्विक सूचकांक के लिए:
@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);
इसे लगाने का एक तरीका यह है:
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
अपने जीएसआई के रूप में, आप कर सकते हैं।
अंत में, एक जीएसआई हैश + रेंज संयोजन को अद्वितीय होने की आवश्यकता नहीं है, जबकि आधार हैश + रेंज संयोजन को अद्वितीय होना चाहिए। यह कुछ ऐसा है जो दोहरी / बहु तालिका सेटअप के साथ संभव नहीं है, लेकिन जीएसआई के साथ है। नतीजतन, आप अपडेट करते समय आधार और जीएसआई हैश + रेंज दोनों के लिए मान प्रदान करते हैं; इनमें से कोई भी मान रिक्त / शून्य नहीं हो सकता है।
समझाने का दूसरा तरीका: LSI आपको उसी हैश की के साथ आइटम पर अतिरिक्त क्वेरी करने में मदद करता है। GSI आपको "तालिका के पार" वस्तुओं पर समान प्रश्न करने में मदद करता है। तो बहुत उपयोगी है।
यदि आपके पास एक उपयोगकर्ता प्रोफ़ाइल तालिका है: अद्वितीय-आईडी, नाम, ईमेल। यहां अगर आपको नाम, ईमेल पर तालिका को क्वेरी करने की आवश्यकता है - तो उन्हें GSI (LSI अभ्यस्त) बनाने का एकमात्र तरीका है:
यह डॉक्यूमेंटेशन बहुत अच्छी व्याख्या देता है:
https://aws.amazon.com/blogs/aws/now-available-global-secondary-indexes-for-amazon-dynamodb/
मैं इस प्रश्न पर टिप्पणी नहीं कर सकता था, लेकिन जो लेखन और पढ़ने के प्रदर्शन के मामले में बेहतर है:
(टेबल के साथ स्थानीय सूचकांक 100 का थ्रूपुट पढ़ें और लिखें) या (50 के थ्रूपुट को पढ़ने / लिखने के साथ ग्लोबल इंडेक्स 50 के थ्रूपुट को पढ़ने / लिखने के साथ?)
मुझे अपने उपयोग के मामले के लिए अलग विभाजन कुंजी की आवश्यकता नहीं है, इसलिए आवश्यक कार्यक्षमता के लिए स्थानीय सूचकांक पर्याप्त होना चाहिए।
GSI का उपयोग लगातार रीड के लिए नहीं किया जा सकता है।
एलएसआई का उपयोग लगातार रीड के लिए किया जा सकता है लेकिन वे मुख्य विभाजन आकार को 10GB तक सीमित कर देंगे। इसके अलावा LSI केवल टेबल निर्माण पर ही बनाए जा सकते हैं।