我正在使用Mysql 5.6,并且我基于日期时间运行许多查询。
当扫描某个日期时间范围内的表中的记录时,您认为哪一个在下面的两个查询之间运行得更快,特别是在比较值为#include <iostream>
class mytype_t
{
public:
mytype_t(int v) : _val(v) {/* empty */}
mytype_t operator | (const mytype_t & rhs) const {return (_val | rhs._val);}
private:
int _val;
};
mytype_t func(int v)
{
std::cout << v << std::endl;
return mytype_t(v);
}
int main(int, char **)
{
mytype_t x = func(0) | func(1) | func(2) | func(3) | func(4);
return 0;
}
时?
当然,datetime列已建立索引。
A。使用string type
BETWEEN
B。使用SELECT user_id
FROM users
WHERE created_at BETWEEN '2018-11-01 00:00:00' AND '2018-11-30 23:59:59'
,>=
<=
答案 0 :(得分:1)
我的猜测是没关系,但是您可以使用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
答案 1 :(得分:0)
两个查询都是相同的,完全没有区别。 Quote from SQL92 specs:
6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".