ホームページ > データベース > mysql チュートリアル > MySQL サブクエリ: 最適なパフォーマンスを得るには、いつ EXISTS と IN を使用する必要がありますか?

MySQL サブクエリ: 最適なパフォーマンスを得るには、いつ EXISTS と IN を使用する必要がありますか?

DDD
リリース: 2025-01-04 06:12:40
オリジナル
185 人が閲覧しました

MySQL Subqueries: When Should I Use EXISTS vs. IN for Optimal Performance?

MySQL での EXISTS と IN を使用したサブクエリ: パフォーマンスの最適化

MySQL でサブクエリを使用する場合、2 つの一般的なアプローチがあります。IN を使用する演算子を使用し、EXISTS 演算子を使用します。どちらの方法でも同様の結果が得られますが、パフォーマンスには大きな違いが見られます。

次の 2 つのサブクエリの例を考えてみましょう。

メソッド 1 (IN):

SELECT
   *       
FROM
   tracker       
WHERE
   reservation_id IN (
      SELECT
         reservation_id                                 
      FROM
         tracker                                 
      GROUP  BY
         reservation_id                                 
      HAVING
         (
            method = 1                                          
            AND type = 0                                          
            AND Count(*) > 1 
         )                                         
         OR (
            method = 1                                              
            AND type = 1                                              
            AND Count(*) > 1 
         )                                         
         OR (
            method = 2                                              
            AND type = 2                                              
            AND Count(*) > 0 
         )                                         
         OR (
            method = 3                                              
            AND type = 0                                              
            AND Count(*) > 0 
         )                                         
         OR (
            method = 3                                              
            AND type = 1                                              
            AND Count(*) > 1 
         )                                         
         OR (
            method = 3                                              
            AND type = 3                                              
            AND Count(*) > 0 
         )
   )
ログイン後にコピー

方法 2 (EXISTS):

SELECT
   *                                
FROM
   `tracker` t                                
WHERE
   EXISTS (
      SELECT
         reservation_id                                              
      FROM
         `tracker` t3                                              
      WHERE
         t3.reservation_id = t.reservation_id                                              
      GROUP BY
         reservation_id                                              
      HAVING
         (
            METHOD = 1 
            AND TYPE = 0 
            AND COUNT(*) > 1
         ) 
         OR                                                     
         (
            METHOD = 1 
            AND TYPE = 1 
            AND COUNT(*) > 1
         ) 
         OR                                                    
         (
            METHOD = 2 
            AND TYPE = 2 
            AND COUNT(*) > 0
         ) 
         OR                                                     
         (
            METHOD = 3 
            AND TYPE = 0 
            AND COUNT(*) > 0
         ) 
         OR                                                     
         (
            METHOD = 3 
            AND TYPE = 1 
            AND COUNT(*) > 1
         ) 
         OR                                                     
         (
            METHOD = 3 
            AND TYPE = 3 
            AND COUNT(*) > 0
         )                                             
   )
ログイン後にコピー

問題文で述べたように、方法 1 の実行には方法 2 よりも大幅に時間がかかります。これは、2 つのアプローチのサブクエリの処理方法に根本的な違いがあるためです。

IN 演算子:

IN 演算子を使用すると、MySQL が実行されますサブクエリを複数回 (メイン クエリの行ごとに 1 回) 実行します。この場合、トラッカー テーブルの行ごとにサブクエリが実行され、指定された基準を満たしているかどうかが判断されます。これは、特にサブクエリが複雑であるか、大量のデータが含まれている場合に、重大なパフォーマンスのオーバーヘッドにつながる可能性があります。

EXISTS 演算子:

対照的に、EXISTS 演算子はサブクエリを 1 回だけ実行します。メイン クエリの現在の行に対するサブクエリの結果に一致する行が少なくとも 1 つあるかどうかを確認します。一致する場合、EXISTS 条件は true として評価されます。それ以外の場合は false です。このアプローチは、サブクエリからすべての行を複数回取得する必要がなくなるため、はるかに効率的です。

IN と EXISTS の選択:

一般的には、次のようになります。ほとんどの場合、パフォーマンスが向上するため、可能な限り EXISTS 演算子を使用することをお勧めします。正しい選択をするためのガイドラインをいくつか示します。

  • 特定の条件に一致する行が存在するかどうかを確認する必要がある場合は、EXISTS を使用します。
  • 必要な場合は IN を使用します。特定の基準に一致するすべての行を取得します。
  • サブクエリの結果が非常に大きい場合、EXISTS のパフォーマンスが優れています。 IN.
  • サブクエリの結果が非常に小さい場合、IN は EXISTS よりもパフォーマンスが優れている可能性があります。

追加の考慮事項:

  • Null 値IN 演算子を使用する場合は問題が発生する可能性があります。サブクエリが Null を返す場合、IN 条件全体が Null と評価され、メイン クエリの結果に影響を与える可能性があります。
  • EXISTS はより汎用性が高く、サブクエリが複数の行を返す場合や集計関数が含まれる場合も処理できます。

以上がMySQL サブクエリ: 最適なパフォーマンスを得るには、いつ EXISTS と IN を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート