単純な用途では、MySQL はほぼ必然的に同じ方法でそれらを実行するため、これは好みと読みやすさの方法です (これは大きな議論の対象です)。
ただし、より複雑なクエリ、特にOUTER JOIN
ディスクと io バウンドになる可能性のある s を含む集計クエリでは、OUTER JOIN クエリで WHERE 句を使用しないと、パフォーマンスと目に見えない影響が生じる可能性があります。
8 分間または 0.8 秒間実行されるクエリの違いは、特にインデックスに関連するため、最終的には句に依存する可能性があります ( MySQL がインデックスを使用する方法):句は、クエリ オプティマイザに必要な情報を提供するためのコア部分です。ジョブを実行し、最も効率的な方法でクエリを実行する方法をエンジンに伝えます。WHERE
WHERE
MySQL が WHERE を使用してクエリを最適化する方法から:
「このセクションでは、WHERE 句を処理するために行うことができる最適化について説明します...テーブルを結合するための最適な結合の組み合わせは、すべての可能性を試すことによって見つけられます。ORDER BY 句と GROUP BY 句のすべての列が同じテーブルに由来する場合、そのテーブルは入会時に優先します。」
結合内のテーブルごとに、より単純な WHERE が構築され、テーブルの WHERE 評価が高速になり、行ができるだけ早くスキップされます。
いくつかの例:
Using where
EXTRAに NO を指定したフル テーブル スキャン (タイプ = ALL)
[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id AND cr.role = cr2.role AND cr.util = 1000
[Err] Out of memory
インデックス ( , )を使用where
して結果を最適化するためにUsing where
Using index
使用します。
[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id
WHERE cr.role = cr2.role
AND cr.util = 1000
515661 rows in set (0.124s)
**** ON/WHERE の組み合わせ - 同じ結果 - 同じ計画EXPLAIN
*******
[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id
AND cr.role = cr2.role
WHERE cr.util = 1000
515661 rows in set (0.121s)
通常、MySQL は上記のような単純なクエリを見つけ出し、同様に実行しますが、そうでない場合もあります。
外部結合クエリのパフォーマンス:
LEFT JOIN と RIGHT JOIN の両方が OUTER JOINSであるため (詳細なレビューはこちら)、デカルト積の問題が発生するため、テーブル スキャンの回避を回避して、クエリに不要な行をできるだけ多く削除する必要があります。できるだけ。
WHERE
、インデックスとクエリ オプティマイザを一緒に使用すると、、、などの集約関数を注意深く使用すると、デカルト積によって生じる問題を完全に解消できます。ユーザーによる適切なインデックス作成と WHERE の利用によって、実行時間の大幅な短縮が達成されます。句。AVERAGE
GROUP BY
SUM
DISTINCT
ついに
繰り返しになりますが、大部分のクエリでは、クエリ オプティマイザはこれらを同じ方法で実行します。これは好みの方法ですが、クエリの最適化が重要になる場合WHERE
、非常に重要なツールになります。INNER JOIN
インデックス付きの列を追加の ON..AND ON 句として指定すると、特定のケースでパフォーマンスが向上することがわかりましたが、その理由はわかりませんでした。