MySQL - क्यों हर क्षेत्र को इंडेक्स नहीं करता है?


107

हाल ही में मैंने अनुक्रमितों के आश्चर्य को सीखा है, और प्रदर्शन में नाटकीय रूप से सुधार हुआ है। हालाँकि, मैंने जो कुछ भी सीखा है, मैं इस प्रश्न का उत्तर नहीं खोज सकता।

इंडेक्स बहुत अच्छे हैं, लेकिन टेबल को अविश्वसनीय रूप से तेज बनाने के लिए कोई भी सभी क्षेत्रों को क्यों नहीं इंडेक्स कर सकता है? मुझे यकीन है कि ऐसा नहीं करने का एक अच्छा कारण है, लेकिन तीस-फ़ील्ड तालिका में तीन फ़ील्ड कैसे हैं? एक 30 क्षेत्र में 10? एक रेखा कहां से आनी चाहिए और क्यों?


7
अनुक्रमित की गई 10k प्रविष्टियों के साथ एक तालिका में एक मान सम्मिलित करने का प्रयास करें, सभी प्रविष्टियों को आवेषण / हटाने के कारण अद्यतन करना होगा और यह एक बहुत बड़ा ओवरहेड है और मेमोरी ओवरहेड का कुछ हद तक अगर प्रत्येक मूल्य में एक सूचकांक है
यीशु रामोस

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

1
यदि आप 30 क्षेत्रों के साथ एक तालिका बना रहे हैं, तो आपको वास्तव में अपनी तालिका संरचनाओं को देखना चाहिए। उनके साथ काम करने के लिए बहुत कठिन होना चाहिए।
जाले

जवाबों:


122

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

आपके पास अनंत स्मृति नहीं है। इसे बनाते हुए सभी अनुक्रमित RAM = अच्छे में फिट होते हैं।

आपके पास अनंत समय नहीं है। केवल उन स्तंभों को अनुक्रमित करना जिनकी आपको अनुक्रमित आवश्यकता होती है, सम्मिलित करें / हटाएं / अपडेट प्रदर्शन हिट करें।


11
सामान्य समझ देने के लिए अच्छा आकस्मिक उत्तर, लेकिन वास्तव में यह निर्धारित करने में ज्यादा मदद नहीं करता कि सूचकांक पर रेखा कहां खींचनी है। तुम कैसे जान सकते हो? बस उन्हें सामान्यतः खेतों में जोड़ें और सर्वोत्तम के लिए आशा करें?
एंड्रयू

@ और डेढ़ साल बाद, क्या आपको अपने सवाल का जवाब मिल गया?
सिंजई

1
@ सिनजाई उन्हें आमतौर पर उन स्तंभों से जोड़ते हैं जहां शायद अंगूठे का एक अच्छा नियम है। लेकिन अन्यथा आप बहुत कुछ पढ़ सकते हैं यदि आप सूचकांकों के विशेषज्ञ बनना चाहते हैं तो यह पता चला है। जैसे। stackoverflow.com/questions/3049283/…
एंड्रयू

डिस्क स्थान मत भूलना।
jpmc26

27

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

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


6
लिंक MS SQL सर्वर के लिए है ; यह सवाल MySQL के
OMG Ponies

5
@OMG लिंक के अधिकांश बिंदु सभी प्रमुख RDBMS पर लागू होते हैं
रिचर्डTheKiwi

5
@ रीचर्ड उर्फ ​​सायबरकीवी: अनुक्रमणिका ANSI द्वारा कवर नहीं की जाती हैं - यह एक चमत्कार है कि प्रत्येक विक्रेता ने समान शब्दावली का उपयोग किया है। लेकिन फिर भी, केवल SQL सर्वर और MySQL शब्दावली "क्लस्टर" और "गैर-क्लस्टर" सूचकांक का उपयोग करते हैं - इसका मतलब उस पर MySQL की तुलना में SQL सर्वर में अधिक है। यह गारंटी देने के लिए कुछ भी नहीं है कि एक विक्रेता को दूसरे के लिए सिफारिशें लागू की जानी चाहिए।
OMG पॉनीज़

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

10

आपको CRUD की जरूरतों को संतुलित करना होगा। टेबल पर लिखना धीमा हो जाता है। जहां तक ​​रेखा खींचना है, यह इस बात पर निर्भर करता है कि डेटा को किस तरह से छाना जा रहा है (छनन छनन आदि)।


और यह भी हर सूचकांक कुछ डेटाबेस स्थान लेता है
अकाथस

@ एंथनस: उपलब्ध सबसे छोटी हार्ड ड्राइव को गीगाबाइट में मापा जाता है ।
ओएमजी पोंजी

4
@OMG लेकिन ब्रायन बताते हैं कि RAM नहीं। यह है कभी नहीं से अधिक आप की जरूरत है की दुकान में एक अच्छा विचार। RAM / बैकअप में डेटा / इंडेक्स कैशिंग, बैकअप मीडिया (वे टेप जो फिट होंगे) आदि सभी बेकार इंडेक्स से प्रभावित होते हैं
RichardTheKiwi

9
संसाधन की प्रचुरता बेकार या अक्षमता का कोई कारण नहीं है।
स्मैंडोली

6
सच है, लेकिन बाधाओं वे 10+ साल पहले क्या नहीं थे।
ओएमजी पोंजी

2

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


2

यह उत्तर मेरी व्यक्तिगत राय है जो मैं उत्तर देने के लिए अपने गणितीय तर्क का उपयोग कर रहा हूं

दूसरा सवाल सीमा के बारे में था कि कहां रुकना है, पहले कुछ गणितीय गणना करने दें, मान लें कि हमारे पास एक फ़ील्ड में L फ़ील्ड्स के साथ N पंक्तियाँ हैं यदि हम सभी फ़ील्ड्स को अनुक्रमणित करते हैं तो हमें L नई इंडेक्स तालिकाएँ मिलेंगी जहाँ हर तालिका एक में सॉर्ट होगी इंडेक्स फ़ील्ड का डेटा अर्थपूर्ण तरीके से, पहली नज़र में अगर आपकी टेबल एक डब्ल्यू वेट है तो यह W * 2 हो जाएगा (1 टेरा 2 टेरा हो जाएगा) यदि आपके पास 100 बड़ी टेबल है (मैंने पहले से ही प्रोजेक्ट में काम किया है जहाँ टेबल नंबर था चारों ओर 1800 टेबल) आप इस जगह (100 तेरा) को 100 बार बर्बाद करेंगे, यह बुद्धिमान से बहुत दूर है।

यदि हम सभी तालिकाओं में अनुक्रमित लागू करेंगे, तो हमें सूचकांक अपडेट के बारे में सोचना होगा एक अद्यतन सभी अनुक्रमणिकाओं को ट्रिगर किया गया था यह समय में सभी चुनिंदा समकक्षों के बराबर है

इससे मैं यह निष्कर्ष निकालता हूं कि आपके पास इस परिदृश्य में है कि यदि आप इस समय को ढीला कर देंगे, तो इसे चयन में खोना बेहतर होगा और न ही कोई अद्यतन क्योंकि यदि आप एक ऐसे क्षेत्र का चयन करेंगे जिसे अनुक्रमित नहीं किया गया है तो आप सभी क्षेत्रों पर एक और चयन को ट्रिगर नहीं करेंगे जो हैं अनुक्रमित नहीं किया गया

क्या सूचकांक करने के लिए?

विदेशी कुंजी: एक पर आधारित होना चाहिए

प्राथमिक-कुंजी: मुझे अभी तक इस बारे में निश्चित नहीं है कि यदि कोई व्यक्ति इसे पढ़ता है तो इस मामले में मदद कर सकता है

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

इस 3 बिंदुओं से मैं यह निष्कर्ष निकाल सकता हूं कि अगर हमारे पास L फ़ील्ड K कुंजी से बना है तो सीमा कहीं पास होनी चाहिए ((L-K)/2)+K L / 10 से अधिक या कम

यह उत्तर मेरे तर्क और व्यक्तिगत निर्णयों पर आधारित है


1

किसी तालिका के सभी स्तंभों को अनुक्रमित करना एक अच्छा विचार नहीं है। जबकि यह तालिका को पढ़ने के लिए बहुत तेज़ बना देगा, यह लिखने के लिए बहुत धीमा हो जाता है। प्रत्येक स्तंभ को अनुक्रमित करने वाली तालिका में लिखना, उस तालिका में नया रिकॉर्ड रखना और फिर प्रत्येक स्तंभ की जानकारी को अपनी अनुक्रमणिका तालिका में शामिल करना होगा।


मुझे यकीन नहीं है कि अगर यह तालिका को तेजी से पढ़ रहा है, खासकर अगर डेटा-तालिका केवल 100 एमबी है, लेकिन सूचकांक। 300 एमबी या उससे अधिक।
डेविड

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