【问题标题】:MySQL indexes on query with Where, GroupBy and OrderBy clausesMySQL 使用 Where、GroupBy 和 OrderBy 子句的查询索引
【发布时间】:2016-10-13 13:40:27
【问题描述】:

如何提高以下查询的性能?哪些索引可能有帮助?

SELECT platform, country, Source, window,
Round(SUM(ProjectedARPI*PlayerCount) / SUM(PlayerCount), 2) AS ProjectedARPI, 
Round(SUM(ProjectedARPIOrganicLow*PlayerCount) / SUM(PlayerCount), 2) AS ProjectedARPIOrganicLow, 
Round(SUM(ProjectedARPIOrganicMed*PlayerCount) / SUM(PlayerCount), 2) AS ProjectedARPIOrganicMed, 
Round(SUM(ProjectedARPIOrganicHigh*PlayerCount) / SUM(PlayerCount), 2) AS ProjectedARPIOrganicHigh, 
SUM(PlayerCount) AS PlayerCount, SUM(PayerCount) AS PayerCount, 
CASE WHEN(SUM(PlayerCount) > 500 AND SUM(PayerCount) > 10) THEN TRUE ELSE FALSE END AS isSignificant, 
ProjectionDate, 
min(CohortRangeLow) as CohortRangeLow, 
max(CohortRangeHigh) as CohortRangeHigh 
FROM web_synch.UI_data 
WHERE PlayerCount > 0 AND ProjectionDate BETWEEN '2015-07-25' AND '2016-10-25' AND window = 365 
GROUP BY Platform, country, source, ProjectionDate 
ORDER BY Platform, source, ProjectionDate;

【问题讨论】:

  • 您可以先尝试格式化查询。我了解您是该网站的新手,但查询一团糟。读不出来,就无法改进。
  • 感谢 Bobski 编辑帖子。
  • 请务必在代码前添加 4 个空格
  • 当然可以。

标签: mysql sql indexing indices


【解决方案1】:

对于这个查询,基本上你唯一希望使用索引是:UI_data(window, ProjectionDate, PlayerCount)UI_data(window, PlayerCount, ProjectionDate)。哪个更好取决于哪个选择更少的记录。 . .我猜第一个更好。

【讨论】:

  • 感谢戈登的回复!只是想了解为什么 GROUP-BY 列的索引在这里起作用?
  • (请忽略以上评论)感谢 Gordon 的回复!只是想了解为什么 GROUP-BY 列的索引在这里不起作用?
  • 除了您建议的 WHERE 子句索引外,我还为 GROUP-BY 子句添加了索引。但是当查询运行时,它只使用 where 子句的索引,而不是 group 子句的索引。
  • @Mayank 。 . .一般来说,查询每个表只使用一个索引(这是一种概括,但我认为对于 MySQL 来说总是如此)。
  • 当然,戈登,谢谢!
【解决方案2】:

我建议这是最好的索引:

INDEX(window,          -- first because "="
      ProjectionDate   -- range
     )                 -- nothing after range will be looked at

这比之前建议的 3 列索引有一点优势,因为索引会略小。

更多讨论:Index cookbook.

我预计会有两种类型——一种用于GROUP BY,一种用于ORDER BY。如果您将ORDER BYGROUP BY 列表设为相同,它会运行得更快一些。

可能的错误:如果ProjectionDateDATE 数据类型,则范围是三个月加一天。推荐这种模式:

    ProjectionDate >= '2015-07-25'
AND ProjectionDate  < '2016-07-25' + INTERVAL 3 MONTH

【讨论】:

  • 感谢瑞克的反馈。我会尝试您的建议并查看改进。还将检查您提到的可能的错误。
猜你喜欢
  • 2012-12-29
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多