Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जॉइन-व्हेयर-ग्रुप द्वारा सही इंडेक्सिंग अस्थायी उपयोग से बचने वाले चुनिंदा प्रश्नों द्वारा; फाइलसॉर्ट का उपयोग करना

मैं इस तरह की क्वेरी लिखूंगा:

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 पंक्तियों में तालिकाओं के आकार के साथ, हम एक इष्टतम निष्पादन योजना और एक भयानक निष्पादन योजना के बीच प्रदर्शन (बीता हुआ समय) में महत्वपूर्ण अंतर नहीं देखने जा रहे हैं।

जब कोई भी तालिका लाखों पंक्तियों तक मापी जाती है, तब अंतर स्पष्ट हो जाएगा। निष्पादन योजना की अनुकूलक पसंद प्रत्येक तालिका के आंकड़ों (आकार, पंक्तियों की संख्या, स्तंभ कार्डिनैलिटी) से प्रभावित होती है, इसलिए निष्पादन योजना तालिका आकार में वृद्धि के साथ बदल सकती है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL तालिका को लैटिन1 से utf8 में बदलें

  2. सोनार MySQL डेटाबेस तक पहुँचने में असमर्थ:java.sql.SQLException:उपयोगकर्ता 'sonar'@'glassfishdev.ccs.local' के लिए प्रवेश निषेध (पासवर्ड का उपयोग करके:हाँ)

  3. mysql मामले में सबक्वायरी जब क्लॉज

  4. तालिका बनाते समय MySQL त्रुटि 1022

  5. Xamarin के माध्यम से MySql डेटाबेस से कनेक्ट करें