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). 请参阅 Henrik Grubbström 在 MySQL 文档中的评论,MySQL如何优化 WHERE 子句页面:

<> 运算符忽略索引:

因此,如果使用索引使查询更快(例如,如果 99% 的表有X = 'A'),请使用第一个选项。

注意:运算符是 SQL 标准不等式运算符!=的同义词(在 MySQL 中) 。<>

于 2013-01-29T16:17:02.030 回答
0

您的第二个操作应该更快,因为它需要较少的逻辑检查。如果它正在扫描一个值,它只需要检查以确保它不是A,你的第一个操作需要匹配B,然后如果没有匹配,C. 关于索引的使用,这取决于您的索引是什么样的以及它是如何被调用的。如果您在列上有一个索引W, X并且您只 filter X,则该索引将不会被用作索引从左到右工作。

于 2013-01-29T16:06:51.827 回答
0

直接相等 (=) 和不等式 (!=) 需要相同的时间。最好的情况下,您的查询将同时运行,但最坏的情况下,情况 1. 可能会更慢,因为您正在添加另一个情况以通过OR.

当然不知道是否有索引或 X 的值分布会影响性能......

于 2013-01-29T16:08:47.313 回答
0

在我看来,第二项更好,因为它总是只有一个比较;在第一项中,如果要测试的值是“C”或“A”,则您必须进行 2 次比较,第一次(X =“B”)将失败,然后第二次比较给出最终结果。

于 2013-01-29T16:09:09.170 回答
0

如果案例 1 使用索引,在我看来,如果 X 上有索引,它应该比案例 2 更快,如果案例 2 不使用索引,在我看来它不会。一般来说。它还取决于值的实际分布:如果显着偏斜,结果将相应变化。

于 2013-01-29T16:10:51.267 回答