2011-12-22 4 views
5

मेरे पास SELECT कथन है जिसे मैं अनुकूलित करना चाहता हूं। mysql - order by optimization कहता है कि कुछ मामलों में सूचकांक का उपयोग ORDER BY को अनुकूलित करने के लिए नहीं किया जा सकता है। विशेष रूप से बिंदु:क्या ऑप्टिमाइज़ेशन द्वारा ऑर्डर निम्नलिखित SELECT कथन में प्रभावी होता है?

आप t1 कहां कुंजी 2 = निरंतर आदेश से एक प्रमुख
चुनें * की nonconsecutive भागों पर आदेश BY का उपयोग key_part2 द्वारा;

मुझे सोचता है, यह मामला हो सकता है। मैं निम्नलिखित अनुक्रमित उपयोग कर रहा हूँ:

UNIQUE KEY `met_value_index1` (`RTU_NB`,`DATETIME`,`MP_NB`), 
KEY `met_value_index` (`DATETIME`,`RTU_NB`) 

निम्नलिखित एसक्यूएल बयान के साथ:

SELECT * FROM met_value 
WHERE rtu_nb=constant 
AND mp_nb=constant 
AND datetime BETWEEN constant AND constant 
ORDER BY mp_nb, datetime 
  • यह काफी सूचकांक met_value_index1 हटाना होगा और नया आदेश देने RTU_NB, MP_NB, DATETIME साथ इसे बनाने?
  • क्या मुझे RTU_NB को ORDER BY खंड में शामिल करना है?


परिणाम: मैं कोशिश की है क्या @meriton सुझाव दिया और सूचकांक met_value_index2 गयी। SELECT 1.2 सेकंड के बाद पूरा हुआ, पहले यह 5.06 सेकंड के बाद पूरा हुआ। निम्नलिखित प्रश्नों से संबंधित नहीं है लेकिन एक साइड नोट के रूप में: कुछ अन्य प्रयासों के बाद मैंने इंजन को माइस्सम से इनो डीबी में स्विच किया - rtu_nb, mp_nb, datetime प्राथमिक कुंजी के रूप में - और बयान 0.13 सेकंड के बाद पूरा हुआ!

उत्तर

1

मुझे आपकी क्वेरी नहीं मिली है। यदि किसी पंक्ति को वापस आने के लिए mp_np = constant से मेल खाना चाहिए, तो लौटाई गई सभी पंक्तियों में mp_nb होगा, इसलिए खंड द्वारा क्रम में mp_nb समेत कोई प्रभाव नहीं पड़ता है। मैं सुझाव है कि आप शब्दार्थ बराबर बयान का उपयोग करें:

SELECT * FROM met_value 
WHERE rtu_nb=constant 
AND mp_nb=constant 
AND datetime BETWEEN constant AND constant 
ORDER BY datetime 

बेकार में क्वेरी अनुकूलक भ्रमित से बचने के लिए।

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

मामले यहाँ है यही कारण है, तो डेटाबेस पंक्तियों जहां rtu_nb=constant AND datetime BETWEEN constant AND constant के लिए met_value_index1 से अधिक एक सूचकांक रेंज स्कैन वास्तव में कर सकता है, और फिर क्या इन पंक्तियों से प्रत्येक के लिए mp_nb=constant जाँच, लेकिन यह आवश्यक तुलना में कहीं अधिक पंक्तियों की जाँच के लिए राशि होता अगर mp_nb=constant में उच्च चयनकता है।अलग-अलग रखें, सूचकांक में मेल खाने वाली पंक्तियां संगत होने पर एक सूचकांक सबसे उपयोगी होता है, क्योंकि इसका मतलब है कि इंडेक्स रेंज स्कैन केवल उन पंक्तियों को स्पर्श करेगा जिन्हें वास्तव में वापस करने की आवश्यकता है।

निम्नलिखित सूचकांक इसलिए इस प्रश्न के लिए और अधिक उपयोगी हो जाएगा:

UNIQUE KEY `met_value_index2` (`RTU_NB`,`MP_NB`, `DATETIME`), 
मिलान करने वाले सभी पंक्तियों के रूप में

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

+0

आपके स्पष्टीकरण और सुझाव के लिए धन्यवाद। मैं इसे आज़माउंगा और जल्द से जल्द परिणामों की रिपोर्ट करूंगा - वर्तमान में रिमोट मशीन बंद है - और मैं उत्सुक हूं, क्या बदलेगा। –

0

WHERE क्लॉज में दिखाई देने वाले फ़ील्ड का क्रम इंडेक्स में ऑर्डर से मेल खाना चाहिए। तो आपकी वर्तमान क्वेरी के साथ आपको rtu_nb, mp_nb, डेटाटाइम के क्रम में फ़ील्ड के साथ एक अनुक्रमणिका की आवश्यकता है।

+0

[यह सच नहीं है] (http://stackoverflow.com/questions/3805863/order-of-ands-in-where-clause-for-greatest-performance), और प्रश्न के लिए भी प्रासंगिक नहीं है। –

+0

MySQL में, यह बिल्कुल सही है। यह innodb इंजन इंडेक्स के लिए विशेष रूप से सच है। इस मामले पर मेरिटन्स का जवाब देखें या जवाडनी पाठ्यपुस्तक पढ़ें। – Anony

1

मुझे नहीं लगता कि यह ORDER BY के लिए किसी भी इंडेक्स का उपयोग करेगा। लेकिन आपको execution plan पर देखना चाहिए। या here

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