MYSQL按日期分组性能查询

MYSQL按日期分组性能查询,mysql,performance,query-optimization,Mysql,Performance,Query Optimization,我目前正在编写一个查询,它将在MySQL数据库中的MYISAM表上运行多次 该查询需要大量(可能是多达100000+)行,并获得每月总计。我当前使用的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_c

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

该查询需要大量(可能是多达100000+)行,并获得每月总计。我当前使用的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) 在数据库中有一个month-year int字段,并更新此字段 当我添加行时(例如2014年7月的714行)

对于哪个最快的问题,答案很简单:两种方法都试一下,然后测量一下

SQL端的性能实际上不受日期转换的影响。它由分组决定,尤其是排序的排序

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


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

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

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

请记住,在使用函数时,MySQL不能对
分组依据
标准使用任何索引优化。如果您有一个大表并且需要此计算,通常会为它们创建单独的索引列(如)。

将您的月/年信息存储在单独的列中,并在其上设置索引(如果这是一个常用的或时间关键型查询)。