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

क्वेरी प्रदर्शन में सुधार कैसे करें (कमांड परिणाम समझाएं f.e. का उपयोग करके)

आप कुछ इस तरह की कोशिश कर सकते हैं (हालांकि इसका परीक्षण करना मेरे लिए व्यावहारिक नहीं है)

SELECT
    sac.surveyId,
    q.cat,
    SUM((sac.answer_id*q.weight))/SUM(q.weight) AS score,
    user.division_id,
    user.unit_id,
    user.department_id,
    user.team_id,
    division.division_name,
    unit.unit_name,
    dpt.department_name,
    team.team_name
FROM survey_answers_cache sac
    JOIN
    (
        SELECT
            s.surveyId,
            sc.subcluster_id
        FROM
            surveys s
            JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
            JOIN cluster c ON sc.cluster_id = c.cluster_id
        WHERE
            c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0
    ) AS v ON v.surveyid = sac.surveyid
    JOIN user ON user.user_id = sac.user_id
    JOIN questions q ON q.question_id = sac.question_id
    JOIN division ON division.division_id = user.division_id
    LEFT JOIN unit ON unit.unit_id = user.unit_id
    LEFT JOIN department dpt ON dpt.department_id = user.department_id
    LEFT JOIN team ON team.team_id = user.team_id
GROUP BY user.team_id, v.surveyId, q.cat
ORDER BY v.surveyId, user.team_id, q.cat ASC

इसलिए मुझे आशा है कि मैंने कुछ गड़बड़ नहीं की।

वैसे भी, विचार आंतरिक क्वेरी में है कि आप अपनी स्थिति के आधार पर केवल उन पंक्तियों का चयन करते हैं जिनकी आपको आवश्यकता है। यह एक छोटी tmp तालिका बनाएगा क्योंकि यह केवल 2 फ़ील्ड दोनों ints को खींचती है।

फिर बाहरी क्वेरी में आप उन तालिकाओं में शामिल होते हैं जिन्हें आप वास्तव में शेष डेटा, ऑर्डर और समूह से खींचते हैं। इस तरह आप छोटे डेटासेट पर सॉर्ट और ग्रुप कर रहे हैं। और आपका जहां क्लॉज सबसे इष्टतम तरीके से चल सकता है।

आप इनमें से कुछ तालिकाओं को छोड़ भी सकते हैं क्योंकि उनमें से कुछ से केवल डेटा खींच रहा है, लेकिन पूर्ण स्कीमा को देखे बिना और यह कैसे संबंधित है, यह कहना मुश्किल है।

लेकिन आम तौर पर इस भाग (उप-क्वेरी) को बोलते हुए

SELECT
    s.surveyId,
    sc.subcluster_id
FROM
    surveys s
    JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
    JOIN cluster c ON sc.cluster_id = c.cluster_id
WHERE
    c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0

क्या आपके WHERE क्लॉज से सीधे तौर पर प्रभावित होता है। देखें ताकि हम इस हिस्से को ऑप्टिमाइज़ कर सकें और फिर बाकी डेटा को जोड़ने के लिए इसका इस्तेमाल कर सकें।

ऊपर से टेबल हटाने का एक उदाहरण आसानी से निकाला जा सकता है, इस पर विचार करें

SELECT
    s.surveyId,
    sc.subcluster_id
FROM
    surveys s
    JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
WHERE
    sc.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0

c टेबल cluster डेटा को केवल जहां से खींचने के लिए उपयोग नहीं किया जाता है। ऐसा नहीं है

    JOIN cluster c ON sc.cluster_id = c.cluster_id
 WHERE
    c.cluster_id=?

के समान या समकक्ष

WHERE
    sc.cluster_id=?

और इसलिए हम उस जुड़ाव को पूरी तरह समाप्त कर सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. URL के लिए सर्वश्रेष्ठ डेटाबेस फ़ील्ड प्रकार

  2. डेटाबेस में फ़ाइलें छवि सरणी सम्मिलित करना

  3. अपरिभाषित सूचकांक नाम

  4. Laravel MySQL उसी क्रम में परिणाम कैसे ऑर्डर करें जिसमें क्लॉज में है

  5. नेस्टेड सेट मॉडल (MySQL) में डेटा कैसे डालें;