【问题标题】:MySQL Performance DATE_FORMAT() vs YEAR() AND MONTH()MySQL 性能 DATE_FORMAT() 与 YEAR() 和 MONTH()
【发布时间】:2016-05-18 13:49:09
【问题描述】:

在查找当前月份和年份的时间戳时,哪个性能更好?

SELECT *
FROM mytable
WHERE YEAR(CURRENT_TIMESTAMP) = YEAR(mytable.timestamp)
  AND MONTH(CURRENT_TIMESTAMP) = MONTH(mytable.timestamp)

或

SELECT *
FROM mytable
WHERE DATE_FORMAT(CURRENT_TIMESTAMP,'%m-%Y') = DATE_FORMAT(mytable.timestamp,'%m-%Y')

【问题讨论】:

  • 你为什么不试试呢?我会说他们应该有类似的性能,因为不能使用索引。 (他们不是 sargeable)

标签: mysql database performance


【解决方案1】:

为了获得更好的性能并能够在mytable.timestamp 中使用索引,请将当前日期截断为月份。

 SELECT DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-01')

这会创建一个常量值,您可以对其进行索引搜索。

然后你可以得到这个月的所有记录

SELECT *
FROM mytable
WHERE mytable.timestamp >= DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-01')

【讨论】:

  • 谢谢,有趣的答案。我认为这是要走的路
  • @user3790083 是的,这很好;相反,在WHERE 子句中使用列作为函数的参数几乎从来都不是一个好主意,因为这会破坏索引并经常迫使服务器为 Every 评估函数。单身的。排。该解决方案通过与可解析为常量表达式的内容进行比较来避免这种情况,因为NOW()-like 函数会在查询开始时冻结它们的值,并在运行查询中保持它直到查询完成。如果您在一年中的最后一天午夜之前运行此查询,那么它不会突然出错,在中途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2013-09-23
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多