X(A、B、C)の3つの可能な値を考えると、実行する方が速いですか:
WHERE (X = 'B' OR X = 'C')
、 またWHERE X != 'A'
それとも依存しますか?もしそうなら、それは何に依存していますか?
X(A、B、C)の3つの可能な値を考えると、実行する方が速いですか:
WHERE (X = 'B' OR X = 'C')
、 またWHERE X != 'A'
それとも依存しますか?もしそうなら、それは何に依存していますか?
オプション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 標準の不等式演算子!=
の同義語です。<>
直接の等号 (=) と不等号 (!=) には同じ時間がかかります。最良の場合、クエリは同時に実行されますが、最悪の場合、ケース 1. でチェックする別のケースを追加しているため、遅くなる可能性がありますOR
。
もちろん、インデックスがあるかどうか、または X の値の分布がパフォーマンスに影響を与える可能性があるかどうかはわかりません...
私の意見では、2 番目の項目は常に 1 つの比較にすぎないため、より優れています。テストする値が 'C' または 'A' の場合、最初の項目で 2 つの比較を行う必要があります。最初の (X = 'B') は失敗し、2 番目の比較で最終結果が得られます。
2 番目の操作は、必要な論理チェックが 1 つ少ないため、高速になります。値をスキャンしている場合、それが ではないことを確認するだけでよくA
、最初の操作が一致する必要があり、一致B
しない場合はC
. インデックスの使用に関しては、インデックスがどのように見えるか、およびどのように呼び出されるかによって異なります。列W, X
にインデックスがあり、フィルターのみをX
使用する場合、インデックスは左から右に機能するため、インデックスは使用されません。
ケース 1 がインデックスを使用する場合、私の見解では、X にインデックスがある場合はそうすべきですが、ケース 2 がインデックスを使用しない場合、ケース 2 よりも高速になります。一般に。また、値の実際の分布にも依存します。大幅に偏っている場合、結果はそれに応じて異なります。