2013-01-03 16 views
6

मैं entrytable से स्तंभ text की सामग्री का चयन करना चाहते हैं।MySQL EXPLAIN के आउटपुट की व्याख्या कैसे करें?

  • index_user (उपयोगकर्ता)
  • index_datum (गृहीत)
  • index_status_mit_spam (स्थिति, status_spam_user, status_spam_system)

व्याख्या परिणाम:

EXPLAIN SELECT text 
FROM entrytable 
WHERE user = 'username' && 
`status` = '1' && (
    `status_spam_user` = 'no_spam' 
    || (
     `status_spam_user` = 'neutral' && 
     `status_spam_system` = 'neutral' 
    ) 
) 
ORDER BY datum DESC 
LIMIT 6430 , 10 

तालिका तीन सूचकांकों है है:

id select_type  table  type possible_keys      key   key_len  ref  rows Extra 
1 SIMPLE   entrytable ref  index_user,index_status_mit_spam index_user 32   const 7800 Using where; Using filesort 
  • possible_keys सूचकांक MySQL का उपयोग करना चाहें और keys सूचकांक MySQL वास्तव में उपयोग करता है?
  • सूचकांक index_status_mit_spam क्यों नहीं किया जाता है? क्वेरी में, colums, सूचकांक में के रूप में एक ही क्रम है ...
  • क्यों सूचकांक index_datumORDER BY के लिए इस्तेमाल नहीं कर रहा है?
  • मैं अपने टेबल सूचकांक या क्वेरी कैसे अनुकूलित कर सकते हैं?

उत्तर

4

का जवाब अपने प्रश्नों (क्वेरी उपरोक्त तालिका में एक लाख प्रविष्टियों के बारे में हो रही 3 सेकंड तक की जरूरत है):

  • possible_keys सूचकांक और keys सूचकांक MySQL MySQL का उपयोग करना चाहें है वास्तव में का उपयोग करता है? हां यह सही है।

  • क्यों सूचकांक index_status_mit_spam नहीं किया जाता है? क्वेरी में, कॉलम में इंडेक्स के समान ऑर्डर होता है। SQL यह निर्धारित करने के लिए कि कौन सी अनुक्रमणिका का उपयोग करना है, तालिका के सूचकांक पर आंकड़ों का उपयोग करता है। चुनिंदा कथन में फ़ील्ड के क्रम का कोई प्रभाव नहीं है जिस पर इंडेक्स का उपयोग करना है। इंडेक्स के आसपास के आंकड़ों में इंडेक्स और अन्य चीजों की विशिष्टता जैसी जानकारी शामिल है। अधिक unqiue अनुक्रमणिका का उपयोग होने की संभावना है। इसके बारे में यहां और पढ़ें: http://dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.html या यहां: http://dev.mysql.com/doc/refman/5.0/en//myisam-index-statistics.html। ये कारक निर्धारित करते हैं कि MySQL उपयोग करने के लिए एक अनुक्रमणिका का चयन करें। यह केवल एक सूचकांक का उपयोग करेगा।

  • क्यों सूचकांक index_datum द्वारा आदेश के लिए इस्तेमाल नहीं कर रहा है? MySQL केवल एक इंडेक्स का उपयोग करेगा, एक क्वेरी के दौरान दो नहीं, क्योंकि दूसरी अनुक्रमणिका का उपयोग करने से क्वेरी को धीमा कर दिया जाएगा। एक इंडेक्स पढ़ना टेबल नहीं पढ़ रहा है। यह क्वेरी की परिचालन दक्षता से संबंधित है। यहां उत्तर हैं जो कुछ अवधारणाओं को समझा सकते हैं: https://dba.stackexchange.com/questions/18528/performance-difference-between-clustered-and-non-clustered-index/18531#18531 या Adding limit clause to MySQL query slows it down dramatically या MySQL indexes and when to group them। इन उत्तरों में बहुत अधिक जानकारी है जो आपको MySQL इंडेक्सिंग को समझने में मदद करेगी।

  • मैं अपने टेबल-इंडेक्स या क्वेरी को कैसे अनुकूलित कर सकता हूं? (उपर्युक्त क्वेरी तालिका में लगभग दस सेकंड प्रविष्टियों के साथ 3 सेकंड तक की आवश्यकता है)। वैसे यहां एक फाइलोर्ट है जो शायद आपको धीमा कर रहा है। यह हो सकता है कि तालिका में बहुत से इंडेक्स हैं और MySQL गलत चुन रहा है।

आप यह समझना होगा कि अनुक्रमित पढ़ता को गति और धीमी हो जाती है नीचे तालिकाओं के लिए लिखते हैं की जरूरत है। तो सिर्फ इंडेक्स जोड़ना हमेशा एक अच्छा विचार नहीं है। उपरोक्त उत्तरों और पॉइंटर्स को आपको ठोस समझ प्राप्त करने में मदद करनी चाहिए।

1
  • possible_keys अपनी तालिका के सभी सूचकांकों (चाबी या सूचकांक कॉलम)
  • MySQL अनुकूलक एक प्रश्न निष्पादित करने के लिए, यह किसी भी सूचकांक (आवश्यक नहीं प्राथमिक कुंजी) का उपयोग कर सकते सबसे अच्छा तरीका है, या कोई भी
  • का फैसला करता है को दर्शाता है http://dev.mysql.com/doc/refman/5.1/en/index-hints.html -
  • MySQL का उपयोग करें या possible_keys कॉलम में लिखा गया एक सूचकांक की अनदेखी करने, आपकी क्वेरी
  • चेक इस लिंक में FORCE INDEX, USE INDEX, या IGNORE INDEX उपयोग कराने के लिए।

    आप संकेत के लिए एक खंड जोड़कर इंडेक्स संकेत का दायरा निर्दिष्ट कर सकते हैं। यह क्वेरी प्रसंस्करण के विभिन्न चरणों के लिए निष्पादन योजना के अनुकूलक के चयन पर अधिक सुदृढ़ नियंत्रण प्रदान करता है। केवल इंडेक्स को प्रभावित करने के लिए जब MySQL निर्णय लेता है कि तालिका में पंक्तियों को कैसे ढूंढें और कैसे जुड़ें, प्रक्रिया के लिए कैसे उपयोग करें। पंक्तियों को क्रमबद्ध करने या समूहित करने के लिए इंडेक्स उपयोग को प्रभावित करने के लिए, समूह द्वारा या उसके लिए ऑर्डर के लिए उपयोग करें। (हालांकि, यदि कोई तालिका के लिए एक कवर सूचकांक है और यह मेज तक पहुँचने के लिए प्रयोग किया जाता है, अनुकूलक {द्वारा आदेश | ग्रुप द्वारा} सूचकांक ध्यान न दें ध्यान नहीं देगा। संकेत है कि सूचकांक को निष्क्रिय कि)

  • कोशिश विभिन्न सूचकांक के लिए मजबूर - सुनिश्चित करें कि के लिए इस लिंक की जाँच - MySQL `FORCE INDEX` use cases?

  • समझे उत्पादन प्रारूप व्याख्या - http://dev.mysql.com/doc/refman/5.1/en/explain-output.html

+2

* "possible_keys अपनी तालिका के सभी सूचकांकों (चाबी या सूचकांक कॉलम) को दर्शाता है" * - सच नहीं। यह इंडेक्स को इंगित करता है जो संभावित रूप से प्रश्न में क्वेरी के लिए उपयोग किया जा सकता है। – Madbreaks

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