ホームページ >データベース >mysql チュートリアル >INNER JOIN の OR 条件によってパフォーマンスが低下するのはなぜですか?
データベースの最適化: INNER JOIN の OR 条件のパフォーマンスへの影響
データベース クエリの最適化では、JOIN ステートメントのさまざまな条件の影響を理解することが重要です。よくある問題の 1 つは、INNER JOIN での OR 条件の使用です。
次のクエリを考えてみましょう:
<code class="language-sql">SELECT mt.ID, mt.ParentID, ot.MasterID FROM dbo.MainTable AS mt INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID OR ot.ID = mt.ParentID</code>
このクエリは最初に実行するのに数分かかります。詳細に検査した結果、問題は INNER JOIN の OR 条件であることが判明しました。
この問題を解決するために、クエリは LEFT JOIN のペアを使用するように書き直されました。
<code class="language-sql">SELECT mt.ID, mt.ParentID, CASE WHEN ot1.MasterID IS NOT NULL THEN ot1.MasterID ELSE ot2.MasterID END AS MasterID FROM dbo.MainTable AS mt LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL</code>
最適化されたクエリは約 1 秒で実行を完了します。
INNER JOIN で OR 条件を使用すると、次の理由からクエリのパフォーマンスに重大な影響を与えます。
したがって、そのような条件は連結された結果セットを使用して表現する方が良いでしょう。上の例では、これは次のように変換されます:
<code class="language-sql">SELECT * FROM maintable m JOIN othertable o ON o.parentId = m.id UNION ALL SELECT * FROM maintable m JOIN othertable o ON o.id = m.parentId</code>
等価結合を使用して結果を連結することにより、クエリ オプティマイザーはパフォーマンスを低下させることなく効率的に操作を実行できます。 ここでの UNION ALL
の使用に注意してください。重複した行を削除する必要がある場合は、UNION
を使用してください。
以上がINNER JOIN の OR 条件によってパフォーマンスが低下するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。