Mysql 更好的方法是:选择带有trunc日期的日期或介于两者之间的日期

Mysql 更好的方法是:选择带有trunc日期的日期或介于两者之间的日期,mysql,Mysql,我需要创建一个查询,根据日期选择mysql数据库的一些数据,但在我的where子句中,我必须选择以下选项: 1-trunc日期: select count(*) from mailing_user where date_format(create_date, '%Y-%m-%d')='2013-11-05'; 2-在之间使用 select count(*) from mailing_user where create_date between '2013-11-05 00:00:00' and

我需要创建一个查询,根据日期选择mysql数据库的一些数据,但在我的where子句中,我必须选择以下选项:

1-trunc日期:

select count(*) from mailing_user where date_format(create_date, '%Y-%m-%d')='2013-11-05';
2-在之间使用

select count(*) from mailing_user where create_date between '2013-11-05 00:00:00' and '2013-11-05 23:59:59';

这两个查询将起作用,但什么更好?或者,推荐什么?为什么?

如果您在创建日期有索引,则第2号会更快,因为第一号无法使用索引快速扫描结果。
但是,这需要在创建日期上有一个索引


否则,我想它们的速度会差不多,可能第二个速度会更快,因为比较的处理时间更短(日期时间比较,而不是转换为字符串和比较字符串),但我怀疑这是否有意义。

这里有一篇文章要读

如果创建的_date列已编制索引,则第二次查询将更快

但是,如果列没有索引,并且这是您定义的日期格式,则可以使用以下查询

select count(*) from mailing_user where DATE(create_date) = '2013-11-05';

我使用
DATE
而不是
DATE\u格式,因为我可以利用这种格式('2013-11-05')的固有特性。

从您的问题来看,您似乎想选择一天的记录,根据
的规定,DATETIME或TIMESTAMP值可以包含精度高达微秒(6位)的尾随小数秒部分。

这意味着您的第二个查询实际上可能会变得不走运,并丢失在当天最后一秒插入到表中的一些记录,因此我要说第一个查询更精确,并且保证总是得到正确的结果

这样做的缺点是,您无法使用
date\u format
-函数为该列编制索引,因为MySQL对此不感兴趣

如果您不想使用
date\u格式
来回避精度问题,您将进行更改

其中创建日期介于“2013-11-05 00:00:00”和“2013-11-05 23:59:59”之间

进入


其中create_date>='2013-11-05 00:00:00'和create_date<'2013-12-05 00:00:00'

在我看来,如果列被编入索引且未经测试,则第二个查询的执行速度比第一个查询快。日期列的类型是什么?是日期时间吗?@Slowcoder是的。。。。它的DateTime@ElvisOliveira,无论何时尝试将函数应用于可能位于索引中的列,基本上都是在使索引无用。两者之间比较好。