【问题标题】:MYSQL Group By Date Performance QueryMYSQL Group By Date 性能查询
【发布时间】:2014-07-06 17:25:09
【问题描述】:

我目前正在编写一个查询,它将在 MySQL DB 中的一个 MISAM 表上运行多次。

查询需要很多行(可能高达 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) 在数据库中有一个月-年 int 字段并更新它 当我添加行时(例如 2014 年 7 月的 714)?

【问题讨论】:

  • 将您的month_year信息存储在单独的列中并在其上设置索引(如果这是经常使用或时间紧迫的查询)。

标签: mysql performance query-optimization


【解决方案1】:

哪个最快的问题的答案很简单:同时尝试并测量。

SQL 端的性能并没有真正受到日期转换的影响。它由group by 决定,尤其是排序的排序。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2011-06-19
      • 2021-04-18
      • 2014-06-21
      • 2013-01-21
      • 2022-06-14
      • 2011-08-05
      相关资源
      最近更新 更多