【问题标题】:SELECT and GROUP BY month efficientlySELECT 和 GROUP BY 月有效
【发布时间】:2014-07-10 16:37:44
【问题描述】:

我有一个date 类型的列。我想每月对特定年份的行进行分组。 我做了以下事情:

SELECT SUM(price), DATE_FORMAT(production_date, '%Y%m')  
FROM TABLE  
WHERE YEAR(production_date) = ?    
GROUP BY 2   

有没有更好/更有效的方法来做到这一点?

【问题讨论】:

  • 您可能有兴趣查看 codereview.stackexchange.com,该网站似乎专门研究此类问题。
  • GROUP BY 2 是什么意思?
  • ^ GROUP BY 第二列(是的,mysql 支持这样的语义)。致 OP:如果不了解完整的上下文(结构、大小、索引等),就不可能正确回答
  • @AlmaDo:Fair point。但是使用函数会禁用索引,现在查询的形成方式不会使用它们。所以基本上我对表达相同事物的不同形式感兴趣
  • 如果您的查询足够频繁地运行,我建议创建单独的月份和年份列(或者,甚至可能是“年-月”)并将日期的这些部分存储在其中。如果您按该列创建索引,它肯定会提高性能 - 但是,增加量将取决于该索引的基数

标签: mysql sql select optimization group-by


【解决方案1】:

而不是使用YEAR 函数指定年份

SELECT SUM(price), DATE_FORMAT(production_date, '%Y%m')  
FROM TABLE  
WHERE YEAR(production_date) = 2014
GROUP BY 2

这样指定

SELECT SUM(price), DATE_FORMAT(production_date, '%Y%m')  
FROM TABLE  
WHERE production_date BETWEEN '2014-01-01' AND '2014-12-31'
GROUP BY 2

第二个查询使数据库能够使用production_date上的索引

【讨论】:

  • 如果production_date 列有索引,那么第二个查询将使用该索引作为 WHERE 子句,是的 - 但我相信 OP 请求是关于 - 如何优化 GROUP BY 索引(和第二个查询将无法产生用于分组的索引使用)
  • @AlmaDo 是的,如果 op 只对优化 GROUP BY 感兴趣,那么这将无济于事,但标题指的是 SELECTGROUP BY 所以也许他们正在寻找任何优化? op将不得不澄清
【解决方案2】:

你快到了:)

SELECT SUM(price), MONTH(production_date)  
FROM TABLE  
WHERE YEAR(production_date) = ?    
GROUP BY 2

【讨论】:

  • MONTHDATE_FORMAT : both 在一般情况下将无法使用索引。那是因为对 MySQL 使用函数几乎总是导致无法使用索引。因此,在性能方面与 OP 查询没有区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2020-08-15
  • 2012-09-17
相关资源
最近更新 更多