4

X(A、B、C)の3つの可能な値を考えると、実行する方が速いですか:

  1. WHERE (X = 'B' OR X = 'C')、 また
  2. WHERE X != 'A'

それとも依存しますか?もしそうなら、それは何に依存していますか?

4

5 に答える 5

4
  • オプション1:

    WHERE (X = 'B' OR X = 'C')
    

    WHERE X IN ('B', 'C')
    

    は同等であり、 でインデックスを使用できます(X)

  • オプション 2:

    WHERE X != 'A'
    

    ではインデックスを使用しません(X)。MySQL ドキュメントの Henrik Grubbström によるコメント、MySQL がWHERE 句を最適化する方法のページを参照してください。

<> 演算子のインデックスは無視されます。

したがって、インデックスを使用するとクエリが高速になる場合 (たとえば、テーブルの 99% に がある場合X = 'A')、最初のオプションを使用します。

注: この演算子は、(MySQL では) SQL 標準の不等式演算子!=の同義語です。<>

于 2013-01-29T16:17:02.030 に答える
0

直接の等号 (=) と不等号 (!=) には同じ時間がかかります。最良の場合、クエリは同時に実行されますが、最悪の場合、ケース 1. でチェックする別のケースを追加しているため、遅くなる可能性がありますOR

もちろん、インデックスがあるかどうか、または X の値の分布がパフォーマンスに影響を与える可能性があるかどうかはわかりません...

于 2013-01-29T16:08:47.313 に答える
0

私の意見では、2 番目の項目は常に 1 つの比較にすぎないため、より優れています。テストする値が 'C' または 'A' の場合、最初の項目で 2 つの比較を行う必要があります。最初の (X = 'B') は失敗し、2 番目の比較で最終結果が得られます。

于 2013-01-29T16:09:09.170 に答える
0

2 番目の操作は、必要な論理チェックが 1 つ少ないため、高速になります。値をスキャンしている場合、それが ではないことを確認するだけでよくA、最初の操作が一致する必要があり、一致Bしない場合はC. インデックスの使用に関しては、インデックスがどのように見えるか、およびどのように呼び出されるかによって異なります。列W, Xにインデックスがあり、フィルターのみをX使用する場合、インデックスは左から右に機能するため、インデックスは使用されません。

于 2013-01-29T16:06:51.827 に答える
0

ケース 1 がインデックスを使用する場合、私の見解では、X にインデックスがある場合はそうすべきですが、ケース 2 がインデックスを使用しない場合、ケース 2 よりも高速になります。一般に。また、値の実際の分布にも依存します。大幅に偏っている場合、結果はそれに応じて異なります。

于 2013-01-29T16:10:51.267 に答える