MYSQL Group By Date性能查询

时间:2014-07-06 17:25:09

标签: mysql performance query-optimization

我目前正在编写一个将在MySQL数据库中的MYISAM表上多次运行的查询。

查询需要很多行(可能是多达100,000多行)并获得每月总计。我目前使用的SQL是

SELECT DATE_FORMAT(ct_cdatetime, "%m-%Y") AS Month, SUM(ct_total), SUM(ct_charge)
FROM client_transaction
WHERE (...omitted for this example...)
GROUP BY DATE_FORMAT(ct_cdatetime, "%m-%Y") ORDER BY ct_cdatetime ASC

我意识到强制MySQL将日期强制转换为字符串的性能问题。

是否更快和/或更好的做法?
  • 1)保持原样
  • 2)选择所有行并在PHP中将它们分组 阵列。
  • 3)在数据库中有一个月 - 年字段并更新它 当我添加行(例如2014年7月的714)?

2 个答案:

答案 0 :(得分:1)

对于哪个问题最快的答案很简单:尝试两者并进行衡量。

SQL端的性能并未受到日期转换的影响。它由group by确定,特别是排序的排序。

我怀疑在应用程序端传输数据和完成工作会更快。特别是,您必须将大量(数据)数据从数据库传输到应用程序。然后,您必须复制将在数据库中完成的应用程序中的工作。

但是,应用程序端的内存中算法可能比数据库端更通用的算法更快。在应用程序端执行工作可能会更快。

答案 1 :(得分:1)

以下查询更快,因为它只提取日期的组件而不是创建格式化文本:

SELECT YEAR(dtfield), MONTH(dtfield), COUNT(*)
FROM mytable
GROUP BY YEAR(dtfield), MONTH(dtfield);

请记住,在使用函数时,MySQL不能对GROUP BY条件使用任何索引优化。如果你有一个大表并且需要这个计算,通常会为它们创建单独的索引列(如noticed by hellcode)。