哪个datetime范围扫描性能更好:between还是comparison操作符

6uxekuva  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(276)

我使用的是mysql 5.6,我运行了许多基于datetime的查询。
在扫描表中某个日期时间范围内的记录时,您认为下面两个查询之间哪个运行得更快,尤其是在比较值为 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'

b。使用 `>=` ,  `<=` ```
SELECT user_id 
FROM users 
WHERE created_at >= '2018-11-01 00:00:00' AND '2018-11-30 23:59:59' >= created_at
ebdffaop

ebdffaop1#

我猜这无关紧要,但是您可以使用mysql的show profile选项对它们进行基准测试。基本用法提供了处理查询时不同状态的持续时间,但是对于不同的资源有更具体的度量。
设置会话的配置文件:

SET profiling = 1;

在一个非常大的数据集中运行第一个版本的查询,并使用以下命令检查配置文件:

SHOW PROFILE;

然后,对另一个查询重复相同的步骤。
我会重复这个过程好几次,并且可以在不同的日子里确保服务器上运行的其他进程不会对结果和最终比较产生太大影响。
这是我做的一个本地测试的一个例子,但只是为了显示你从测试中得到的数据 SHOW PROFILE . 表很小,我每次只运行一次查询。;)
为了 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
mlnl4t2r

mlnl4t2r2#

两个查询都是相同的,完全没有区别。引用sql92规范:

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

相关问题