sql >> データベース >  >> RDS >> Mysql

クエリのパフォーマンスを向上させる方法(explainコマンドの結果を使用するなど)

    このようなことを試すことができます(これをテストするのは実用的ではありませんが)

    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
    

    だから私は何も台無しにしないことを望みます。

    とにかく、アイデアは、where条件に基づいて必要な行のみを選択する内部クエリにあります。これにより、両方のintの2つのフィールドのみがプルされるため、より小さなtmpテーブルが作成されます。

    次に、外部クエリで、残りのデータを実際にプルするテーブル、順序、およびグループに結合します。このようにして、小さなデータセットで並べ替えとグループ化を行います。そして、where句は最適な方法で実行できます。

    これらのテーブルのいくつかからデータを取得するだけであるため、これらのテーブルのいくつかを省略できる場合もありますが、完全なスキーマとその関連性を確認する必要はありません。

    しかし、一般的に言えば、この部分(サブクエリ)

    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. データベース接続はjarで機能しませんが、Eclipseでは機能します

    2. SQL Server実行プラン—それは何であり、パフォーマンスの問題にどのように役立ちますか?

    3. lavaral 5 ERROR {(SQLSTATE[HY000][1045]ユーザー'root'@'localhost'のアクセスが拒否されました(パスワードを使用:YES)}

    4. MSSQLクエリを使用して親のすべての子を取得する