MySQL的“BETWEEN”在性能方面如何表现?

55

在(尤其是)MySQL 中查询以下内容时,是否有更好的性能:

SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300

失败,超出限制,结束

SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300

是否只是将"or BETWEEN"语法替换为第二个SQL语句?

4个回答

51

我记得两者没有区别,但你可以自己验证一下:

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300

与:

explain plan for
SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300

生成相同的计划。


32

根据文档

  • expr BETWEEN min AND max

如果expr大于或等于min并且expr小于或等于max,则BETWEEN返回1,否则返回0。 如果所有参数都是相同类型,则这等效于表达式(min<=exprANDexpr<=max)。 否则,按照第11.2节“表达式计算中的类型转换”所述的规则进行类型转换,但应用于所有三个参数。

因此它只是语法糖。


8

BETWEEN更清晰地表达了意图,阅读起来也更加流畅(这是SQL旨在实现的目标)。


6
虽然你说得没错,这样读起来确实更好,但问题是关于性能的。¯_(ツ)_/¯ - Jools
@Jools - 在这个例子中,BETWEEN语句少了10个字节...所以这就是你的性能优化 :) - Aaron Cicali

5
以下三个语句将产生相同的结果:
  1. i BETWEEN x AND y
  2. x <= i AND i <= Y
  3. i >= x AND i <= Y
但在第三种配置中,MySQL 可能会(取决于索引)使用不同的索引:顺序很重要,您应该使用 EXPLAIN 查询进行测试以查看差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接