प्रदर्शन के संदर्भ में, वे सहसंबद्ध उपश्रेणियाँ आपका दोपहर का भोजन खा सकती हैं। और अपने लंचबॉक्स को भी बड़े सेटों के लिए खाएं, क्योंकि जिस तरह से MySQL उन्हें प्रोसेस करता है। उनमें से प्रत्येक सबक्वायरी बाहरी क्वेरी में लौटाई गई प्रत्येक पंक्ति के लिए निष्पादित हो जाती है। और यह बड़े सेट के लिए बहुत महंगा हो सकता है।
एक वैकल्पिक तरीका यह है कि सभी सामग्री के लिए पसंद और नापसंद को अमल में लाने के लिए इनलाइन दृश्य का उपयोग किया जाए, और फिर उसमें शामिल होने का ऑपरेशन किया जाए।
लेकिन, यह दृष्टिकोण महंगा भी हो सकता है, खासकर जब आपको केवल कुछ सामग्री पंक्तियों के लिए वोट "गिनती" की आवश्यकता होती है, एक अरब पंक्तियों में से। अक्सर, बाहरी क्वेरी से एक विधेय होता है जिसे इनलाइन दृश्य में भी शामिल किया जा सकता है, ताकि उन पंक्तियों की संख्या को सीमित किया जा सके जिनकी जांच और वापसी की आवश्यकता है।
हम उस इनलाइन दृश्य में बाहरी जुड़ाव का उपयोग करना चाहते हैं, इसलिए यह आपकी क्वेरी के बराबर परिणाम देता है; content
. से एक पंक्ति लौटा रहा है जब vote
में कोई मेल खाने वाली पंक्तियाँ न हों टेबल।
SELECT [... BUNCH OF FIELDS ...]
, COALESCE(v.likes,0) AS likes
, COALESCE(v.dislikes,0) AS dislikes
, COALESCE(v.myvote,'.Constants::NO_VOTE.') AS myvote
FROM content c
LEFT
JOIN ( SELECT vt.cId
, SUM(vt.vote = '.Constants::LIKE.') AS likes
, SUM(vt.vote = '.Constants::DISLIKE.') AS dislikes
, MAX(IF(vt.userId = '.USER_ID.',vt.vote,NULL)) AS myvote
FROM votes vt
GROUP
BY vt.cId
) v
ON v.cId = c.contentId
[... OTHER STUFF ... ]
ध्यान दें कि इनलाइन दृश्य क्वेरी (v
. के रूप में उपनामित) ) vote
. से हर एक पंक्ति को देखने जा रहा है मेज़। यदि आपको केवल एक सबसेट की आवश्यकता है, तो एक उपयुक्त विधेय जोड़ने पर विचार करें (या तो WHERE क्लॉज में या किसी अन्य तालिका में जॉइन के रूप में)। [... OTHER STUFF ...]
. से कोई संकेत नहीं मिला है आपकी क्वेरी में कि क्या यह content
. से कुछ पंक्तियाँ लौटा रहा है या यदि आपको सभी पंक्तियों की आवश्यकता है क्योंकि आप likes
. द्वारा आदेश दे रहे हैं , आदि.
content
. से चयनित पंक्तियों की एक छोटी संख्या के लिए तालिका, सहसंबद्ध उपश्रेणियों (जैसे आपकी क्वेरी में) का उपयोग करना वास्तव में एक विशाल इनलाइन दृश्य को मूर्त रूप देने और इसके विरुद्ध एक जॉइन ऑपरेशन करने की तुलना में तेज़ हो सकता है।
ओह... और दोनों प्रश्नों के लिए, यह बिना कहे चला जाता है कि vote
. पर एक उपयुक्त अनुक्रमणिका cId
. के एक प्रमुख स्तंभ वाली तालिका प्रदर्शन में लाभ होगा। इनलाइन दृश्य के लिए, आप नहीं चाहते कि MySQL के ओवरहेड को filesort
perform निष्पादित करना पड़े ग्रुप बाय करने के लिए उन सभी पंक्तियों पर संचालन। और सहसंबद्ध उपश्रेणियों के लिए, आप चाहते हैं कि वे एक अनुक्रमणिका श्रेणी स्कैन का उपयोग करें, न कि पूर्ण स्कैन का।