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

Mysql Exists vs IN--相関サブクエリvsサブクエリ?

    これはRDBMSにとらわれない答えですが、それでも役立つ場合があります。私の理解では、相関(別名、依存)サブクエリは、おそらく最も頻繁に誤ってパフォーマンスの悪い原因であると非難されています。

    問題は(最も頻繁に説明されているように)、外部クエリのすべての行に対して内部クエリを処理することです。したがって、外部クエリが1,000行を返し、内部クエリが10,000行を返す場合、結果を生成するには、クエリは10,000,000行(外部×内部)をスローする必要があります。同じ結果セットに対する相関のないクエリからの11,0​​00行(外側+内側)と比較すると、それは良くありません。

    ただし、これは最悪のシナリオにすぎません。多くの場合、DBMSはインデックスを利用して、行数を大幅に減らすことができます。内部クエリのみがインデックスを使用できる場合でも、10,000行は最大13シークになり、合計は13,000に減少します。

    存在 演算子は、最初の行の後で行の処理を停止でき、特にほとんどの外側の行が少なくとも1つの内側の行と一致する場合に、クエリコストをさらに削減できます。

    まれに、SQL Server 2008R2が相関サブクエリをマージ結合(両方のセットを1回だけトラバースする-最良のシナリオ)に最適化するのを見たことがあります。この場合、内部クエリと外部クエリの両方で適切なインデックスが見つかります。

    パフォーマンスの低下の本当の原因は、必ずしも相関サブクエリではありません。 、ただしネストされたスキャン



    1. libmysqlclient15-Macの開発?

    2. PostgreSQLで一重引用符で囲まれたテキストを挿入する

    3. SQLServerで文字列値とNULL値を連結する方法

    4. キャッシュなしでMySQLのパフォーマンスを向上