2009-04-25 13 views
48

मैं एक ऐसे प्रोग्राम को बनाए रखने में मदद कर रहा हूं जो अनिवार्य रूप से एक बड़े और जटिल MySQL डेटाबेस के लिए एक दोस्ताना पठन-केवल फ्रंट-एंड है - कार्यक्रम उपयोगकर्ताओं के इनपुट से विज्ञापन-चयन क्वेरी बनाता है, डीबी को प्रश्न भेजता है, परिणाम, उन्हें प्रक्रियाओं के बाद, और उन्हें अच्छी तरह से उपयोगकर्ता को प्रदर्शित करता है।मैं एक MySQL क्वेरी के * पूर्वानुमान * प्रदर्शन के लिए EXPLAIN का उपयोग कैसे करूं?

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

मैं समझाता बयान MySQL के साथ बहुत परिचित नहीं हूँ - मैं चारों ओर कैसे अनुकूलन एक प्रश्न या एक DB स्कीमा, अनुक्रमण, आदि के लिए इसका इस्तेमाल करने के लिए के बारे में जानकारी का एक बहुत देखते हैं, लेकिन मेरे सीमित सीमित उद्देश्य के लिए इसका उपयोग कैसे करें - बस एक भविष्यवाणी करें, डीबी को दिए गए अनुसार (निश्चित रूप से अगर पूर्वानुमान पर्याप्त विश्वसनीय हैं तो मैं अंततः वैकल्पिक रूपों के बीच चयन करने के लिए भी उनका उपयोग कर सकता हूं। क्वेरी ले सकती है, लेकिन, यह भविष्य के लिए है: अभी के लिए, उपरोक्त उद्देश्यों के लिए उपयोगकर्ताओं को प्रदर्शन guesstimates दिखाने के लिए मैं बहुत खुश हूं)।

कोई पॉइंटर्स ...?

उत्तर

20

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

आपको यह भी पता होना चाहिए कि यदि आप उप-प्रश्नों का उपयोग कर रहे हैं, तो भी एक्स्पलाइन चलाना धीमा हो सकता है (लगभग कुछ मामलों में क्वेरी के रूप में धीमा)।

जहां तक ​​मुझे पता है, MySQL किसी क्वेरी को चलाने के समय का अनुमान लगाने का कोई तरीका नहीं प्रदान करता है। क्या आप प्रत्येक क्वेरी को चलाने के लिए लॉग इन कर सकते हैं, फिर पिछले समान प्रश्नों के इतिहास के आधार पर एक अनुमान बनाएं?

+1

की resultset हम इस समय उप प्रश्नों पैदा न करें ताकि बिट एक समस्या नहीं होनी चाहिए के बारे में अधिक पढ़ें। लेकिन सूचक के लिए वैसे भी धन्यवाद - और खबर है कि एक प्रश्न की लागत का अनुमान लगाने का कोई अच्छा तरीका नहीं है (बुरी खबर, लेकिन इससे पहले कि मैं चिमेरा का पीछा करने में असमर्थ समय बिताने से पहले सीखूं!)। –

+10

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

11

मुझे लगता है कि यदि आप इससे कुछ विश्वसनीय रूप से विश्वसनीय बनाने का मौका चाहते हैं, तो आपको टेबल आकारों से एक सांख्यिकीय मॉडल बनाना चाहिए और क्वेरी प्रोसेसिंग समय से संबंधित एक्सप्लाइन परिणाम घटक टूटा हुआ है। पर आधारित एक क्वेरी निष्पादन समय पूर्वानुमानक बनाने की कोशिश कर रहा है के बारे में सोचने के लिए एक एक्सप्लाइन की सामग्री सिर्फ अस्पष्ट उपयोग के लिए परिष्कृत होने से पहले शर्मनाक रूप से खराब परिणाम दे रही है।

2

MySQL EXPLAIN में Key नामक कॉलम है। अगर इस कॉलम में कुछ है, तो यह एक बहुत अच्छा संकेत है, इसका मतलब है कि क्वेरी इंडेक्स का उपयोग करेगी।

इंडस्ट्रीज का उपयोग करने वाली क्वेरी आमतौर पर उपयोग करने के लिए सुरक्षित होती हैं क्योंकि डेटाबेस डेटाबेस डिजाइनर द्वारा विचार किया गया था जब उन्होंने डेटाबेस बनाया था।

हालांकि

एक और क्षेत्र Extra कहा जाता है। इस फ़ील्ड में कभी-कभी टेक्स्ट using_filesort होता है।

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

निष्कर्ष

इसके बजाय समय एक प्रश्न लेता है भविष्यवाणी करने के लिए प्रयास करने का

, बस इन दो संकेतक को देखो। यदि कोई प्रश्न using_filesort है, तो उपयोगकर्ता से इनकार करें। और इस पर निर्भर करता है कि आप कितना सख्त होना चाहते हैं, यदि क्वेरी किसी भी कुंजी का उपयोग नहीं कर रही है, तो आपको इसे अस्वीकार कर देना चाहिए।

MySQL EXPLAIN statement

संबंधित मुद्दे