अध्याय 9 (पार्सर और ऑप्टिमाइज़र) के अनुसार, साशा पाचेव द्वारा पुस्तक MySQL इंटरनल्स को समझना पुस्तक का पृष्ठ 172
यहाँ निम्नलिखित कार्यों के रूप में एक क्वेरी का मूल्यांकन टूट रहा है:
- निर्धारित करें कि तालिकाओं से रिकॉर्ड प्राप्त करने के लिए किन कुंजियों का उपयोग किया जा सकता है, और प्रत्येक तालिका के लिए सबसे अच्छा एक चुनें।
- प्रत्येक तालिका के लिए, यह तय करें कि क्या एक मेज स्कैन एक कुंजी पर पढ़ना बेहतर है। यदि बहुत सारे रिकॉर्ड हैं जो कुंजी मूल्य से मेल खाते हैं, तो कुंजी के फायदे कम हो जाते हैं और टेबल स्कैन तेज हो जाता है।
- उस क्रम को निर्धारित करें जिसमें क्वेरी में एक से अधिक तालिका मौजूद होने पर तालिकाओं को शामिल किया जाना चाहिए।
- डेड कोड को समाप्त करने के लिए WHRE को फिर से लिखें, अनावश्यक संगणना को कम करने और जहाँ भी संभव हो बाधाओं को बदलने के लिए कुंजी का उपयोग करने का रास्ता खोलें।
- जुड़ने से अप्रयुक्त तालिकाओं को हटा दें।
- निर्धारित करें कि क्या कुंजियों का उपयोग किया जा सकता है
ORDER BY
और GROUP BY
।
- उप-क्षेत्रों को सरल बनाने का प्रयास, साथ ही यह निर्धारित करता है कि उनके परिणामों को किस सीमा तक कैश किया जा सकता है।
- मर्ज देखें (मैक्रो के रूप में दृश्य संदर्भ का विस्तार करें)
उसी पृष्ठ पर, यह निम्नलिखित कहता है:
MySQL ऑप्टिमाइज़र शब्दावली में, प्रत्येक क्वेरी जुड़ने का एक सेट है। जॉइन ज्वाइन शब्द का उपयोग SQL कमांड की तुलना में अधिक मोटे तौर पर किया जाता है। केवल एक मेज पर एक प्रश्न एक पतित जुड़ना है। यद्यपि हम आम तौर पर एक तालिका में शामिल होने के रिकॉर्ड को पढ़ने के बारे में नहीं सोचते हैं, पारंपरिक जोड़ के साथ उपयोग किए जाने वाले समान संरचना और एल्गोरिदम केवल एक तालिका के साथ क्वेरी को हल करने के लिए पूरी तरह से काम करते हैं।
उपसंहार
मौजूद कुंजियों के कारण, डेटा की मात्रा, और क्वेरी की अभिव्यक्ति, MySQL जॉइन्स कभी-कभी हमारे स्वयं के अच्छे (या हम पर वापस पाने के लिए) के लिए काम कर सकते हैं और उन परिणामों के साथ आते हैं जिनकी हम उम्मीद नहीं करते थे और जल्दी से समझा नहीं सकते।
मैंने इस विचित्रता के बारे में पहले भी लिखा था
क्योंकि MySQL क्वेरी ऑप्टिमाइज़र क्वेरी के मूल्यांकन के दौरान कुछ कुंजियों को खारिज कर सकता है।
@ फिल की टिप्पणी से मुझे यह उत्तर पोस्ट करने में मदद मिलेगी (+1 @ फिल की टिप्पणी के लिए)
@ ypercube की टिप्पणी (इसके लिए +1 भी) मेरी पोस्ट का एक कॉम्पैक्ट संस्करण है क्योंकि MySQL का क्वेरी ऑप्टिमाइज़र आदिम है। दुर्भाग्य से, यह तब से होना है क्योंकि यह बाहर के भंडारण इंजन से संबंधित है।
निष्कर्ष
आपके वास्तविक प्रश्न के लिए, MySQL क्वेरी ऑप्टिमाइज़र प्रत्येक क्वेरी के प्रदर्शन मैट्रिक्स को निर्धारित करेगा जब यह किया जाता है
- गिनती की पंक्तियाँ
- कुंजी का चयन करना
- रुक-रुक कर परिणाम की मालिश
- अरे हाँ, वास्तविक जोइन कर रहा है
संभवतः आपको क्वेरी को फिर से लिखना (रिफैक्टिंग) करके निष्पादन के क्रम को रोकना होगा
यहाँ पर आपने जो पहला Query दिया है
select count(*)
from table1 a
join table2 b
on b.key_col=a.key_col
where b.tag = 'Y';
पहले इसका मूल्यांकन करने के लिए इसे फिर से लिखने का प्रयास करें
select count(*)
from table1 a
join (select key_col from table2 where tag='Y') b
on b.key_col=a.key_col;
यह निश्चित रूप से EXPLAIN योजना को बदल देगा। यह बेहतर या बदतर परिणाम उत्पन्न कर सकता है।
मैंने एक बार StackOverflow में एक सवाल का जवाब दिया जहां मैंने इस तकनीक को लागू किया था। EXPLAIN भयावह था लेकिन प्रदर्शन गतिशील था। यह केवल सही अनुक्रमित मौजूद होने और एक उपश्रेणी में लिमिट के उपयोग के कारण काम करता है ।
स्टॉक की कीमतों के साथ, जब यह क्वेरी की बात आती है और उन्हें व्यक्त करने की कोशिश करते हैं, तो प्रतिबंध लागू होते हैं, परिणाम भिन्न हो सकते हैं, और पिछले प्रदर्शन भविष्य के परिणामों का संकेत नहीं है।