मैं इस तरह की क्वेरी लिखूंगा:
SELECT c.time
, SUM(c.counter)
, MAX(p.clustername) AS clustername
FROM cell c
JOIN swap_plan p
ON p.siteid = c.siteid
AND p.clustername = 'Cluster A'
WHERE c.time >= 'day1'
AND c.time <= 'day2'
GROUP
BY c.time
मुझे यकीन है कि cell
. पर एक इंडेक्स होना चाहिए time
. के साथ प्रमुख स्तंभ के रूप में।
MySQL उसी इंडेक्स का उपयोग रेंज विधेय (WHERE क्लॉज में) को संतुष्ट करने के लिए कर सकता है, और GROUP BY को "फाइलसॉर्ट का उपयोग" ऑपरेशन के बिना संतुष्ट करने के लिए कर सकता है।
... ON cell (time)
कॉलम के आकार के आधार पर, एक कवरिंग इंडेक्स इष्टतम प्रदर्शन दे सकता है। एक कवरिंग इंडेक्स में तालिका के सभी कॉलम शामिल होते हैं जो क्वेरी में संदर्भित होते हैं, इसलिए क्वेरी को पूरी तरह से इंडेक्स पेजों से पूरी तरह से संतुष्ट किया जा सकता है, बिना अंतर्निहित टेबल के पेजों को देखे।
... ON cell (time, siteid, counter)
swap_plan
. पर इंडेक्स के लिए , मेरे पास site_id
. के साथ एक अनुक्रमणिका होगी प्रमुख कॉलम के रूप में, और clustername
. सहित कॉलम, इनमें से कोई भी:
... ON swap_plan (clustername, site_id)
या
... ON swap_plan (site_id, clustername)
ऐसा लगता है कि उन दो स्तंभों के संयोजन पर एक अद्वितीय बाधा होने जा रही है, अर्थात site_id
के मान किसी दिए गए clustername
. के लिए अलग होगा . (यदि ऐसा नहीं है, और वही (site_id,clustername)
टपल कई बार प्रकट होता है, कुल counter
. की संभावना है फुलाया जाना।
मैं EXPLAIN
की तलाश में हूं swap_plan
. को 'रेफरी' लुकअप दिखाने के लिए आउटपुट c.siteid
. के मान से तालिका और क्लस्टरनाम के लिए const (शाब्दिक 'क्लस्टर ए') मान।
31 पंक्तियों और 368 पंक्तियों में तालिकाओं के आकार के साथ, हम एक इष्टतम निष्पादन योजना और एक भयानक निष्पादन योजना के बीच प्रदर्शन (बीता हुआ समय) में महत्वपूर्ण अंतर नहीं देखने जा रहे हैं।
जब कोई भी तालिका लाखों पंक्तियों तक मापी जाती है, तब अंतर स्पष्ट हो जाएगा। निष्पादन योजना की अनुकूलक पसंद प्रत्येक तालिका के आंकड़ों (आकार, पंक्तियों की संख्या, स्तंभ कार्डिनैलिटी) से प्रभावित होती है, इसलिए निष्पादन योजना तालिका आकार में वृद्धि के साथ बदल सकती है।