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. laravelqueryphp範囲内の最大値を取得する方法

    2. MySQLで2つのテーブルを結合する

    3. Mysqlはワイルドカードを使用して検索パフォーマンスを向上させます(%%)

    4. 多言語アプリケーションのためのデータベース設計