哪个日期时间范围扫描执行得更好: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".
我正在使用 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".