我目前正在编写一个将在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将日期强制转换为字符串的性能问题。
是否更快和/或更好的做法?答案 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)。