mysql बहुत सारे इंडेक्स?


83

मैं हमारे वर्तमान डेटाबेस के अनुकूलन के लिए कुछ समय बिता रहा हूं।

मैं विशेष रूप से अनुक्रमित देख रहा हूं।

कुछ सवाल हैं:

  • क्या ऐसी कोई चीज़ बहुत अधिक अनुक्रमित है?
  • सूचकांक क्या गति देगा?
  • क्या सूचकांक धीमा होगा?
  • सूचकांक जोड़ना कब अच्छा होगा?
  • सूचकांक जोड़ना कब एक बुरा विचार है?
  • प्रो और कॉन मल्टी-इंडेक्स बनाम मल्टी-कॉलम इंडेक्स हैं?

जवाबों:


150

सूचकांक क्या गति देगा?

डेटा पुनर्प्राप्ति - चयनित बयान।

क्या सूचकांक धीमा होगा?

डेटा हेरफेर - INSERT, UPDATE, DELETE स्टेटमेंट्स।

सूचकांक जोड़ना कब अच्छा होगा?

यदि आपको लगता है कि आप बेहतर डेटा पुनर्प्राप्ति प्रदर्शन प्राप्त करना चाहते हैं।

सूचकांक जोड़ना कब एक बुरा विचार है?

टेबल्स पर है कि भारी डेटा हेरफेर देखेंगे - सम्मिलन, अद्यतन ...

प्रो और कॉन मल्टी-इंडेक्स बनाम मल्टी-कॉलम इंडेक्स हैं?

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

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

WHERE DATE(datetime_column) = ...

11
वाह, यह जानकारी वास्तव में आश्चर्यजनक अच्छी तरह से संरचित और बहुत उपयोगी है! और मेरे लिए सबसे उपयोगी यह था कि एक इंडेक्स जिसमें एक फ़ंक्शन लागू किया जाता है बेकार है ... इस उत्तर के लिए धन्यवाद!
क्रिस

2
@OMG, आपके पिछले पैराग्राफ के बारे में, selectइंडेक्स मर्ज के कारण एक से अधिक इंडेक्स का उपयोग किया जा सकता है । percona.com/blog/2012/12/14/…
पेसियर 19

1
-1 कहने के लिए (1) यह केवल "SELECT" को गति देता है, यह SELECT, UPDATE और DELETE प्रश्नों को गति देगा, बशर्ते कि सूचकांक "WHERE" शर्तों के अनुसार सही तरीके से बनाए गए हों, लेकिन इसके लिए डेटा हेरफेर पर अनुक्रमित अपडेट की आवश्यकता होती है जिसका अर्थ है इंडेक्स के बिना केवल INSERT क्वेरी धीमी (सभी मामलों में) होने वाली हैं और (2) यह कहने के लिए कि MySQL एक समय में केवल एक इंडेक्स का उपयोग कर सकती है।
पैट्रिक अल्लार्ट

अद्यतन के बारे में भ्रामक जानकारी के लिए @PatrickAllaert -1 के रूप में ही, हटाएँ
Eimsas

64

मैं इस सवाल के कुछ जवाबों से असहमत हूं।

क्या ऐसी कोई चीज़ बहुत अधिक अनुक्रमित है?

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

सूचकांक क्या गति देगा?

  • WHERE क्लॉज में स्थितियां खोजें।
  • शर्तों में शामिल हों।
  • ORDER BY के कुछ मामले।
  • ग्रुप बाय के कुछ मामले।
  • अद्वितीय बाधाओं।
  • प्रमुख कुंजी बाधाओं।
  • पूरा पाठ खोजें।

अन्य उत्तरों ने सलाह दी है कि INSERT / UPDATE / DELETE आपके पास जितने अधिक इंडेक्स हैं, उतने धीमे हैं। यह सच है, लेकिन इस बात पर विचार करें कि UPDATE और DELETE के कई उपयोगों में WHERE क्लॉज़ भी हैं और MySQL, UPDATE और DELETE में जॉइन का भी समर्थन है। अनुक्रमणिकाओं को अपडेट करने के ओवरहेड के लिए अनुक्रमणिका बनाने से अधिक इन प्रश्नों का लाभ हो सकता है।

इसके अलावा, InnoDB एक UPDATE या DELETE से प्रभावित पंक्तियों को लॉक करता है। वे इस रो-लेवल लॉकिंग को कहते हैं, लेकिन यह वास्तव में इंडेक्स-लेवल लॉकिंग है। यदि खोज को कम करने के लिए कोई इंडेक्स नहीं है, तो आप जिस विशिष्ट पंक्ति को बदल रहे हैं, उसकी तुलना में InnoDB को बहुत अधिक पंक्तियों को लॉक करना होगा। यह तालिका में सभी पंक्तियों को भी लॉक कर सकता है । ये ताले अन्य ग्राहकों द्वारा किए गए परिवर्तनों को अवरुद्ध करते हैं, भले ही वे तार्किक रूप से संघर्ष न करें।

सूचकांक जोड़ना कब अच्छा होगा?

यदि आप जानते हैं कि आपको एक क्वेरी चलाने की आवश्यकता है जो उपरोक्त मामलों में से एक में सूचकांक से लाभान्वित होगी।

सूचकांक जोड़ना कब एक बुरा विचार है?

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

प्रो और कॉन मल्टी-इंडेक्स बनाम मल्टी-कॉलम इंडेक्स हैं?

कुछ मामलों में, MySQL इंडेक्स-मर्ज ऑप्टिमाइज़ेशन कर सकता है , और या तो इंडेक्स इंडेक्स खोजों से परिणामों को संघ या प्रतिच्छेद कर सकता है। लेकिन यह एक एकल सूचकांक को परिभाषित करने के लिए बेहतर प्रदर्शन देता है इसलिए सूचकांक-मर्ज करने की आवश्यकता नहीं है।

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

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

मेरी प्रस्तुति हाउ टू डिजाईन इंडेक्स, वास्तव में देखें


10
+1 के लिए "... विचार करें कि UPDATE और DELETE के कई उपयोगों में WHERE क्लॉज़ भी हैं और MySQL में, UPDATE और DELETE भी JOINs का समर्थन करते हैं। अनुक्रमणिकाओं को अपडेट करने के ओवरहेड के लिए बनाने से अधिक इन प्रश्नों का लाभ हो सकता है।"
रोब क्रेग

1
इसे अपडेट और विचाराधीन खंड में रखने के लिए स्वीकृत उत्तर होना चाहिए।
लियोनार्डो एमिलियो डोमिंगुएज

1
यह सही उत्तर है, जो सही के रूप में चिह्नित है वह गलत है।
एम्स

7

क्या ऐसी कोई चीज़ बहुत अधिक अनुक्रमित है?

सूचकांक को हाथ में समस्या से सूचित किया जाना चाहिए: तालिकाओं, आपके आवेदन को चलाने वाले प्रश्न, आदि।

सूचकांक क्या गति देगा?

चयन करता है।

क्या सूचकांक धीमा होगा?

INSERT धीमे होंगे, क्योंकि आपको इंडेक्स अपडेट करना होगा।

सूचकांक जोड़ना कब अच्छा होगा?

जब आपके एप्लिकेशन को एक और WHERE क्लॉज की आवश्यकता होती है।

सूचकांक जोड़ना कब एक बुरा विचार है?

जब आपको क्वेरी की आवश्यकता नहीं है या विशिष्टता बाधाओं को लागू करना है।

मल्टी-कॉलम इंडेक्स बनाम कई इंडेक्स के पेशेवरों और विपक्ष?

मुझे सवाल समझ नहीं आ रहा है। यदि आपके पास एक विशिष्ट बाधा है जिसमें कई कॉलम शामिल हैं, तो हर तरह से इसे मॉडल करें।


4

क्या ऐसी कोई चीज़ बहुत अधिक अनुक्रमित है?

हाँ। इंडेक्स बनाने की तलाश में बाहरजाएं , उन्हें आवश्यक रूप से बनाएं।

सूचकांक क्या गति देगा?

अनुक्रमणिका तालिका / दृश्य के विरुद्ध कोई भी प्रश्न।

क्या सूचकांक धीमा होगा?

अनुक्रमित तालिका के खिलाफ किसी भी INSERT बयान को धीमा कर दिया जाएगा, क्योंकि प्रत्येक नए रिकॉर्ड को अनुक्रमित करने की आवश्यकता होगी।

सूचकांक जोड़ना कब अच्छा होगा?

जब एक स्वीकार्य गति से क्वेरी नहीं चल रही है। आप उन रिकॉर्ड्स पर फ़िल्टर कर सकते हैं जो क्लस्टर किए गए PK का हिस्सा नहीं हैं, ऐसे में आपको उन फ़िल्टर के आधार पर अनुक्रमित जोड़ना चाहिए जिन्हें आप खोज रहे हैं (यदि प्रदर्शन फिट बैठता है)।

सूचकांक जोड़ना कब एक बुरा विचार है?

जब आप इसे इसके लिए करते हैं - यानी ओवर-ऑप्टिमाइज़ेशन।

प्रो और कॉन मल्टी-इंडेक्स बनाम मल्टी-कॉलम इंडेक्स हैं?

उन प्रश्नों पर निर्भर करता है जिन्हें आप सुधारने का प्रयास कर रहे हैं।


3

क्या ऐसी कोई चीज़ बहुत अधिक अनुक्रमित है?

हाँ, सभी चीजों की तरह, बहुत सारे अनुक्रमित डेटा हेरफेर को धीमा कर देंगे।

सूचकांक जोड़ना कब अच्छा होगा?

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

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