आपका प्रश्न क्या संबोधित करेगा विषय JOIN DECOMPOSITION है।
पुस्तक के पृष्ठ २० ९ के अनुसार
आप एक बहु-जुड़ने के बजाय कई एकल-तालिका क्वेरी चलाकर, और फिर अनुप्रयोग में शामिल होने का प्रदर्शन समाप्त कर सकते हैं। उदाहरण के लिए, इस एकल क्वेरी के बजाय:
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id = tag.id
JOIN post ON tag_post.post_id = post.id
WHERE tag.tag = 'mysql';
आप इन प्रश्नों को चला सकते हैं:
SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
पृथ्वी पर आप ऐसा क्यों करेंगे? यह पहली नज़र में बेकार लगता है, क्योंकि आपने बदले में कुछ भी प्राप्त किए बिना प्रश्नों की संख्या बढ़ा दी है। हालांकि, इस तरह के पुनर्गठन वास्तव में महत्वपूर्ण प्रदर्शन लाभ दे सकते हैं:
- कैशिंग अधिक कुशल हो सकता है। कई एप्लिकेशन "ऑब्जेक्ट" को कैश करते हैं जो सीधे टेबल पर मैप करते हैं। इस उदाहरण में, यदि टैग के साथ ऑब्जेक्ट
mysql
पहले से ही कैश है, तो एप्लिकेशन पहले क्वेरी को छोड़ देगा। यदि आपको कैश में 123, 567, या 908 की आईडी के साथ पोस्ट मिलते हैं, तो आप उन्हें IN()
सूची से हटा सकते हैं । क्वेरी कैश भी इस रणनीति से लाभान्वित हो सकता है। यदि तालिकाओं में से केवल एक बार बदलता है, तो एक जोड़ को विघटित करने से कैश अमान्य की संख्या कम हो सकती है।
- व्यक्तिगत रूप से प्रश्नों को निष्पादित करना कभी-कभी लॉक विवाद को कम कर सकता है
- एप्लिकेशन में जुड़ने से विभिन्न सर्वरों पर टेबल रखकर डेटाबेस को स्केल करना आसान हो जाता है।
- प्रश्न स्वयं अधिक कुशल हो सकते हैं। इस उदाहरण में,
IN()
शामिल होने के बजाय एक सूची का उपयोग करने से MySQL को पंक्ति IDs सॉर्ट करने में मदद मिलती है और एक पंक्ति के साथ संभव से अधिक पंक्तियों को पुनः प्राप्त किया जा सकता है।
- आप निरर्थक पंक्ति एक्सेस को कम कर सकते हैं। एप्लिकेशन में शामिल होने का अर्थ है प्रत्येक पंक्ति को केवल एक बार पुनर्प्राप्त करना। जबकि क्वेरी में शामिल होना अनिवार्य रूप से एक अपभ्रंश है जो बार-बार एक ही डेटा तक पहुंच सकता है। इसी कारण से, इस तरह के पुनर्गठन से कुल नेटवर्क ट्रैफ़िक और मेमोरी उपयोग भी कम हो सकता है।
- कुछ हद तक, आप इस तकनीक को देख सकते हैं क्योंकि नेस्टेड लूप्स एल्गोरिथ्म MySQL के बजाय मैन्युअल रूप से हैश को कार्यान्वित करने के लिए एक शामिल होने के लिए उपयोग करता है। एक हैश ज्वाइन अधिक कुशल हो सकता है।
नतीजतन, जब आप कैश करते हैं और पहले के प्रश्नों से बहुत सारे डेटा का पुन: उपयोग करते हैं, तो आप एप्लिकेशन में do ज़्यादा जुड़ सकते हैं, आप कई सर्वरों पर डेटा वितरित करते हैं, आप IN()
जॉइन को सूचियों से प्रतिस्थापित करते हैं, या एक जुड़ाव कई बार उसी तालिका को संदर्भित करता है।
अवलोकन
मुझे पहला बुलेटपॉइंट पसंद है क्योंकि जब यह क्वेरी कैश को क्रॉसचेक करता है तो InnoDB थोड़ा भारी-भरकम होता है।
अंतिम बुलेटपॉइंट के लिए, मैंने 11 मार्च, 2013 को एक पोस्ट वापस लिखा था ( क्या एक JOIN स्थिति और WHERE की स्थिति के बीच एक निष्पादन अंतर है? ) नेस्टेड लूप एल्गोरिथ्म का वर्णन करता है। इसे पढ़ने के बाद, आप देखेंगे कि कितना अच्छा विघटन हो सकता है।
पुस्तक से अन्य सभी बिंदुओं के लिए , डेवलपर्स वास्तव में नीचे की रेखा के रूप में प्रदर्शन की तलाश करते हैं। प्रदर्शन संवर्द्धन के लिए कुछ बाहरी साधनों (अनुप्रयोग के बाहर) पर भरोसा करते हैं जैसे तेज़ डिस्क का उपयोग करना, अधिक CPU / Cores प्राप्त करना, भंडारण इंजन को ट्यूनिंग करना और कॉन्फ़िगरेशन फ़ाइल को ट्यूनिंग करना। अन्य लोग नीचे झुकेंगे और बेहतर कोड लिखेंगे। कुछ लोग स्टोर की गई प्रक्रियाओं में सभी व्यापारिक खुफिया कोडिंग का सहारा ले सकते हैं, लेकिन फिर भी अपघटन में शामिल नहीं होते हैं (देखें कि डेटाबेस लेयर में एप्लिकेशन लॉजिक के खिलाफ या अन्य पदों के साथ आवेदन तर्क रखने के लिए क्या तर्क हैं )। यह सभी डेवलपर शॉप की संस्कृति और सहिष्णुता तक है।
कुछ प्रदर्शन से संतुष्ट हो सकते हैं और कोड को नहीं छू सकते हैं। यदि वे रचना में शामिल होने का प्रयास करते हैं तो अन्य को यह एहसास नहीं होता कि महान लाभ हो सकते हैं।
उन डेवलपर्स के लिए जो तैयार हैं ...
कोशिश करो !!!