哪个日期时间范围扫描执行得更好:BETWEEN 或比较运算符

Which datetime range scan performs better: BETWEEN or comparison operators

我正在使用 Mysql 5.6,我 运行 许多基于日期时间的查询。

在特定日期时间范围内扫描 table 中的记录时,您认为以下两个查询之间 运行 哪个更快,尤其是比较值为 string type 时? 当然,datetime 列是有索引的。

一个。使用 BETWEEN

SELECT user_id 
FROM users 
WHERE created_at  BETWEEN '2018-11-01 00:00:00' AND '2018-11-30 23:59:59'

乙。使用 >=<=

SELECT user_id 
FROM users 
WHERE created_at >= '2018-11-01 00:00:00' AND '2018-11-30 23:59:59' >= created_at

我猜这无关紧要,但您可以使用 MySQL 的 SHOW PROFILE 选项对它们进行基准测试。基本用法给出了处理查询时不同状态的持续时间,但是对于不同的资源还有更具体的措施。

为会话设置配置文件:

SET profiling = 1;

运行 你在一个非常大的数据集中的第一个查询版本并检查配置文件:

SHOW PROFILE;

然后,对另一个查询重复相同的步骤。

我会多次重复此过程,并可能在不同的日子里进行,以确保服务器上 运行 的其他过程不会对您的结果和最终比较产生太大影响。

这是我进行的本地测试的示例,但只是为了展示您从 SHOW PROFILE 中获得的数据。 table 很小,我每个查询只 运行 一次。 ;)

  • 用于BETWEEN过滤

    starting    0.000045
    checking permissions    0.000005
    Opening tables  0.000011
    init    0.000020
    System lock 0.000006
    optimizing  0.000017
    statistics  0.000011
    preparing   0.000008
    executing   0.000003
    Sending data    0.000535
    end 0.000004
    query end   0.000006
    closing tables  0.000006
    freeing items   0.000015
    cleaning up 0.000009
    
  • 用于>= AND <=过滤

    starting    0.000048
    checking permissions    0.000004
    Opening tables  0.000010
    init    0.000025
    System lock 0.000005
    optimizing  0.000010
    statistics  0.000011
    preparing   0.000008
    executing   0.000003
    Sending data    0.000531
    end 0.000004
    query end   0.000005
    closing tables  0.000005
    freeing items   0.000016
    cleaning up 0.000008
    

两个查询完全相同,完全没有区别Quote from SQL92 specs:

6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".