哪种日期时间范围扫描效果更好:BETWEEN或比较运算符

时间:2018-11-28 07:05:39

标签: mysql performance datetime between

我正在使用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' >=

<=

2 个答案:

答案 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".