我最近收到了一个要优化的查询,看起来它做得比需要的多得多。
无论如何,查询的一部分对我来说似乎是多余的,我只是想确保它没有做我认为它正在做的更多:
WHERE orders.`date` >
DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 MONTH),"%Y-%m-01")
AND DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01")
根据我的理解,第一个DATE_FORMAT()
应该输出上个月的第一个,然而,我对第二个DATE_FORMAT()
函数没有任何意义,因为它已经在第一个函数中指定了日期???
我的问题是,有人能不能对上面的内容有所了解(如果有的话),或者告诉我如何检查MySQL函数的输出?
谢谢!
要检查此函数的结果,只需执行:
SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");
为了确定这个条件是否真的总是评估为真,只需执行:
SELECT COUNT(*) FROM some_table;
SELECT COUNT(*) FROM some_table
WHERE DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");
您将看到,两个查询的结果(计数)将相同,
请参阅演示:-->http://www.sqlfiddle.com/#!2/03c4d/3
MySql在解析阶段识别常量表达式,并删除计算结果为true的表达式
详细信息如下:http://dev.mysql.com/doc/refman/5.6/en/where-optimizations.html.
要检查MySql是否真的删除了此条件,请执行以下命令:
EXPLAIN EXTENDED
SELECT * FROM some_table
WHERE DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");
SHOW WARNINGS;
这显示的内容如下:
/* select#1 */ select `test`.`some_table`.`x` AS `x`
from `test`.`some_table` where 1
注意where 1
-查询中的整个条件已简化为1(true)。
第一个DATE_FORMAT返回上月的1号,另一个返回昨天所属月份的1号。
我认为这可能是一个拼写错误——如果它是第一个DATE_FORMAT和第二个DATE_FFORMAT之间的一个范围(例如BETWEEN),那么它只返回最后几个月的数据,例如,这是有意义的
您可以使用显示功能的输出
SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");