sql >> Databáze >  >> RDS >> Mysql

Optimalizujte dotaz MySQL, abyste se vyhnuli použití kde; Použití dočasné; Pomocí řazení souborů

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

Pokud je váš stůl MyISAM nebo id není PRIMARY KEY , musíte vytvořit složený ondex na (topic_id, id) .

Pokud je vaše tabulka InnoDB a id je PRIMARY KEY , index pouze na (topic_id) udělá (id budou implicitně přidány do indexu).

Aktualizovat

Tento dotaz bude s největší pravděpodobností ještě efektivnější, pokud máte indexy na (topic_id, id) a (date, id) :

Podrobnosti o výkonu naleznete v tomto článku na mém blogu:

Tento dotaz se dokončí za 30 ms na 100,000 řádky ukázková data:

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

Aby byl tento dotaz efektivní, jsou vyžadovány oba indexy.

Pokud je vaše tabulka InnoDB a id je PRIMARY KEY , pak můžete vynechat id z indexes výše.



  1. Zobrazit obrázek BLOB Laravel 4

  2. CASE SQLite

  3. Jak vytvářet a mazat databáze a tabulky v MySQL

  4. Nejlepší funkce, které je třeba hledat v nástroji pro monitorování serveru SQL