给定 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)
. 请参阅 Henrik Grubbström 在 MySQL 文档中的评论,MySQL如何优化 WHERE 子句页面:
<> 运算符忽略索引:
因此,如果使用索引使查询更快(例如,如果 99% 的表有X = 'A'
),请使用第一个选项。
注意:运算符是 SQL 标准不等式运算符!=
的同义词(在 MySQL 中) 。<>
您的第二个操作应该更快,因为它需要较少的逻辑检查。如果它正在扫描一个值,它只需要检查以确保它不是A
,你的第一个操作需要匹配B
,然后如果没有匹配,C
. 关于索引的使用,这取决于您的索引是什么样的以及它是如何被调用的。如果您在列上有一个索引W, X
并且您只 filter X
,则该索引将不会被用作索引从左到右工作。
直接相等 (=) 和不等式 (!=) 需要相同的时间。最好的情况下,您的查询将同时运行,但最坏的情况下,情况 1. 可能会更慢,因为您正在添加另一个情况以通过OR
.
当然不知道是否有索引或 X 的值分布会影响性能......
在我看来,第二项更好,因为它总是只有一个比较;在第一项中,如果要测试的值是“C”或“A”,则您必须进行 2 次比较,第一次(X =“B”)将失败,然后第二次比较给出最终结果。
如果案例 1 使用索引,在我看来,如果 X 上有索引,它应该比案例 2 更快,如果案例 2 不使用索引,在我看来它不会。一般来说。它还取决于值的实际分布:如果显着偏斜,结果将相应变化。