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

MySQL क्वेरी को ऑप्टिमाइज़ करें कहाँ का उपयोग करने से बचने के लिए; अस्थायी का उपयोग करना; फाइलसॉर्ट का उपयोग करना

SELECT  id, name, last_reply, replies
FROM    (
        SELECT  topic_id, MAX(date) AS last_reply, COUNT(*) AS replies
        FROM    wp_pod_tbl_forum
        GROUP BY
                topic_id
        ) r
JOIN    wp_pod_tbl_forum t
ON      t.topic_id = 0
        AND t.id = r.topic_id
UNION ALL
SELECT  id, name, date, 0
FROM    wp_pod_tbl_forum t
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    wp_pod_tbl_forum r
        WHERE   r.topic_id = t.id
        )
        AND t.topic_id = 0
ORDER BY
       date DESC
LIMIT 0, 20

यदि आपकी तालिका MyISAM है या id PRIMARY KEY नहीं है , आपको (topic_id, id) . पर एक समग्र ऑनडेक्स बनाना होगा ।

अगर आपकी टेबल InnoDB है और id एक PRIMARY KEY है , केवल (topic_id) . पर एक अनुक्रमणिका करेगा (id परोक्ष रूप से अनुक्रमणिका में जोड़ दिया जाएगा)।

अपडेट करें

यह क्वेरी संभवतः और भी अधिक कुशल होगी, बशर्ते कि आपके पास (topic_id, id) पर अनुक्रमणिका हों और (date, id) :

प्रदर्शन विवरण के लिए मेरे ब्लॉग में यह लेख देखें:

यह क्वेरी 30 ms . में पूरी होती है 100,000 . पर पंक्तियों का नमूना डेटा:

SELECT  id, name, last_reply,
        (
        SELECT  COUNT(*)
        FROM    wp_pod_tbl_forum fc
        WHERE   fc.topic_id = fl.topic_id
        ) AS replies
FROM    (
        SELECT  topic_id, date AS last_reply
        FROM    wp_pod_tbl_forum fo
        WHERE   id = (
                SELECT  id
                FROM    wp_pod_tbl_forum fp
                WHERE   fp.topic_id = fo.topic_id
                ORDER BY
                        fp.date DESC, fp.id DESC
                LIMIT 1
                )
                AND fo.topic_id <> 0
        ORDER BY
                fo.date DESC, fo.id DESC
        LIMIT 20
        ) fl
JOIN    wp_pod_tbl_forum ft
ON      ft.id = fl.topic_id
UNION ALL
SELECT  id, name, date, 0
FROM    wp_pod_tbl_forum t
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    wp_pod_tbl_forum r
        WHERE   r.topic_id = t.id
        )
        AND t.topic_id = 0
ORDER BY
       last_reply DESC, id DESC
LIMIT  20

इस क्वेरी के कुशल होने के लिए दोनों अनुक्रमणिकाएँ आवश्यक हैं।

अगर आपकी टेबल InnoDB है और id एक PRIMARY KEY है , तो आप indexes . से 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. SQL तालिका से पंक्तियों का प्रतिशत चुनें?

  2. Ubuntu 20.04 LTS पर MySQL 8 कैसे स्थापित करें?

  3. Mysql में फ़ोन नंबर खोज रहे हैं

  4. NameError:mysql में परिवर्तन सेट करने के बाद नाम '_mysql' परिभाषित नहीं किया गया है

  5. मैसकल में अंतिम अद्यतन पंक्ति आईडी