EXPLAIN आउटपुट बताता है कि मेरे सूचकांक का उपयोग नहीं किया जा रहा है


9

मैंने अपना टेबल केवल एक इंडेक्स के साथ सेट किया है जो केवल_स्टैटस (किया_स्टैटस = INT):

यहां छवि विवरण दर्ज करें

जब मैं उपयोग करता हूं:

EXPLAIN SELECT * FROM reminder  WHERE done_status=2

मुझे यह वापस मिल गया:

आईडी select_type table type संभव__ कुंजी key_len Ref पंक्तियाँ अतिरिक्त
1 SIMPLE रिमाइंडर सभी किए गए_स्टैटस NULL NULL NULL 5 का उपयोग करके कहां

लेकिन जब मैं यह आदेश जारी करता हूं:

EXPLAIN SELECT * FROM reminder  WHERE done_status=1

मैं निम्नलिखित लौटाता हूं:

आईडी select_type table type संभव__ कुंजी key_len Ref पंक्तियाँ अतिरिक्त
1 SIMPLE अनुस्मारक रेफरी_स्टैटस किया_स्टैटस 4 कॉन्स्ट 2   

EXPLAINमुझे पता चलता है यह 5 पंक्तियाँ, दूसरी बार 2 पंक्तियाँ का उपयोग करता है।

मुझे नहीं लगता कि सूचकांक का उपयोग किया जाता है, अगर मैंने इसे पहली बार सही समझा तो मुझे 3 पंक्तियों को देना चाहिए। मुझसे क्या गलती हुई है?

SHOW INDEX FROM reminder:

सारणी
अनुस्मारक 1 किया_स्टैटस 1 किया_स्टैटस ए 5 पूर्ण रिक्त स्थान

विस्तार से बताएं:

id select_type table type possible_keys key key_len Ref पंक्तियाँ फ़िल्टर की गई अतिरिक्त
1 SIMPLE अनुस्मारक रेफरी_स्टैटस किया_स्टैटस 4 कॉन्स्ट 2 100.00

show warnings कुछ दिलचस्पी नहीं दिखाई।


विश्वास करो कि सूचकांक काम करता है। लेकिन मैं नहीं कर सकते कुछ भी आसानी से अपने स्क्रीन शॉट में देखते हैं - आप "yourtable से शो सूचकांक" एक कर सकते हैं

हाँ ने मेरे प्रश्न का संपादन किया

स्कीमा के लिए कृपया
ग्लोरिफ़ि

आउट ऑफ इंटरेस्ट आप "एक्सटेंडेड एक्सटेंडेड" और "शो वार्निंग" के साथ दोहरा सकते हैं, इससे वास्तविक एसक्यूएल mysql चुनता है

@ अवास्तविक गौरव क्या है?

जवाबों:


4

आप गलत समझते हैं कि 'पंक्तियाँ' फ़ील्ड क्या है। यह पंक्तियों की संख्या है जो mysql का अनुमान है कि इसे आपकी क्वेरी को संतुष्ट करने के लिए पढ़ने की आवश्यकता होगी। यह मान काफी गलत हो सकता है। इसका मतलब यह नहीं है कि यह परिणाम में पंक्तियों की संख्या है - या mysql द्वारा पढ़ी गई पंक्तियों की वास्तविक संख्या


इसलिए? मैंने कहा कि यह कहाँ है? इसके लिए ऑप्टिमाइज़र क्या चुनता है? सूचकांक अभी भी काम करता है।

@ajreal इसका मतलब यह नहीं है कि सूचकांक टूट गया है। डेटा को क्वेरी करने के लिए बस सबसे उपयुक्त तरीका है ऑप्टिमाइज़र (उसके दिमाग में)। मुझे लगता है कि ओपी सटीक में सटीक होने के लिए पंक्तियों के कॉलम की उम्मीद कर रहा था। इसका मतलब यह नहीं है कि सूचकांक टूट गया है - बस यह कि mysql इसे (शायद) का उपयोग नहीं करने के लिए चुनें।

1
@ असली: मुझे आपकी बातों में कुछ याद आ रहा है। एक स्पष्टीकरण के पंक्तियों के कॉलम का इंडेक्स के साथ कोई लेना-देना नहीं है? माईस्क्लर इंडेक्स का उपयोग नहीं करना चुनते हैं (हो सकता है कि सभी डेटा एक ही पृष्ठ में हों)। यकीन नहीं होता कि मैं आपकी बात समझ रहा हूँ? 5 पंक्ति तालिका पर क्वेरी अनुकूलन कुछ 'विषम' परिणाम उत्पन्न करने वाला है क्योंकि यह बहुत मायने नहीं रखता है कि आप कैसे अनुकूलन करते हैं।


इस मामले में कौन आशा करता है कि अनुकूलक किस सूचकांक को चुनता है? सूचकांक में कुछ भी गलत नहीं है, क्योंकि आशावादी को ऐसा लगता है कि उसे इसकी आवश्यकता नहीं थी - इससे क्या फर्क पड़ता है?

3

पहले निष्पादन का मैदान सुनिश्चित करने के लिए सूचकांक का उपयोग नहीं करता है,
यह सूचना पर हो सकता है_schema.statistics सूचकांक पर कुछ लिखने के संचालन के बाद डेटा के साथ नहीं पकड़ता है, या तालिका लंबे समय तक एक्सेस नहीं की जाती है।

जैसा कि यहाँ बताया गया है: - MySQL क्वेरी ऑप्टिमाइज़र कहाँ से सूचकांक आँकड़े पढ़ता है?

दूसरी निष्पादन योजना के लिए, यह लगता है कि info_schema.statistics पहले से ही पकड़ और NULL कार्डिनैलिटी समस्या को ठीक करता है।

इसलिए, इंडेक्स ऑप्टिमाइज़र के अनुसार क्वेरी निष्पादित करें।

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


0

पहली निष्पादन योजना एक सूचकांक का उपयोग नहीं कर रही है।

से MySQL संदर्भ वेबसाइट :

कभी-कभी MySQL एक इंडेक्स का उपयोग नहीं करता है, भले ही कोई उपलब्ध हो। एक परिस्थिति जिसके तहत ऐसा होता है जब ऑप्टिमाइज़र का अनुमान है कि सूचकांक का उपयोग करने के लिए तालिका में पंक्तियों के बहुत बड़े प्रतिशत तक पहुंचने के लिए MySQL की आवश्यकता होगी। (इस मामले में, एक टेबल स्कैन के बहुत तेजी से होने की संभावना है क्योंकि इसमें कम सीक्स की आवश्यकता होती है।) हालांकि, यदि ऐसी क्वेरी केवल कुछ पंक्तियों को पुनः प्राप्त करने के लिए LIMIT का उपयोग करती है, तो MySQL किसी भी तरह एक इंडेक्स का उपयोग करता है, क्योंकि यह बहुत जल्दी मिल सकता है परिणाम में लौटने के लिए कुछ पंक्तियाँ।

यदि आपकी तालिका में केवल 5 पंक्तियाँ हैं और आपकी क्वेरी उनमें से 3 का चयन करती है, तो MySQL अनुकूलक ने मान लिया कि यह पूरी तालिका को स्कैन करने के लिए अधिक कुशल है।

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