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

HAVING क्लॉज के साथ धीमी क्वेरी - क्या मैं इसे तेज कर सकता हूं?

एक त्वरित समाधान यह होगा कि फ़िल्टर सबक्वेरी में:

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND s.id IN(
    SELECT g.site_id
    FROM gstats g
    WHERE g.start_date > '2015-04-30' AND g.site_id = s.id
    GROUP BY g.site_id
    HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC

अन्यथा से, आप हर संभावित उम्मीदवार के लिए ऐसी ग्रुपिंग क्वेरी करते हैं। हम इसे EXISTS . के साथ और अधिक सुंदर बना सकते हैं :

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND EXISTS (
    SELECT 1
    FROM gstats g
    WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
    HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC

लेकिन हमने अभी तक काम नहीं किया है, अब हम EXISTS . का उपयोग करेंगे हर . के लिए तत्व। यह अजीब है क्योंकि क्वेरी केवल s.id . पर निर्भर करती है , इसलिए यह केवल समूह . पर निर्भर करता है , व्यक्तिगत पंक्तियाँ नहीं। तो एक संभावित स्पीडअप, लेकिन यह तालिकाओं के आकार पर निर्भर करता है, आदि स्थिति को HAVING पर ले जाना है कथन:

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
GROUP BY s.id
ORDER BY dcount ASC
HAVING EXISTS (
    SELECT 1
    FROM gstats g
    WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
    HAVING SUM(g.results) > 100
)


  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 को पुनरारंभ किए बिना MySQL की धीमी क्वेरी लॉग को कैसे सक्षम कर सकता हूं?

  2. बाहरी आईपी पते का उपयोग करके MySQL डेटाबेस से कनेक्ट नहीं हो सकता

  3. मैं एक MySQL टेबल पर कस्टम चेक बाधा कैसे जोड़ूं?

  4. मारियाडीबी शुरू नहीं हो रहा है:प्लगइन 'फीडबैक' अक्षम है।

  5. MySQL के साथ ग्रुपिंग करते समय किस रो के फील्ड्स लौटाए जाते हैं?