Mysql
 sql >> база данни >  >> RDS >> Mysql

Оптимизирайте MySQL заявката, за да избегнете Използването на where; Използване на временно; Използване на сортиране на файлове

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 , трябва да създадете съставен ondex на (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 , тогава можете да пропуснете id от indexes по-горе.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Много към много вътре Много към много маса

  2. C# с параметри на MySQL INSERT

  3. Съхранение на Mysql байтов масив

  4. Изпращане на пароли през мрежата

  5. JSON_VALUE() в MySQL