2016-10-13 54 views
0

如何提高以下查询的性能?哪些索引可能有帮助?使用Where,GroupBy和OrderBy子句查询MySQL索引

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; 
+2

您可以从尝试格式化查询开始。我知道你是该网站的新成员,但查询很混乱。如果无法阅读,则无法改进。 –

+1

感谢Bobski编辑帖子。 – Mayank

+0

我的请始终在代码前加4个空格 – BobSki

回答

0

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

+0

谢谢戈登的回应!只是想了解为什么GROUP-BY列的索引在这里工作? – Mayank

+0

(请忽略以上评论)感谢戈登的回应!只是想了解为什么GROUP BY列的索引在这里不起作用? – Mayank

+0

除了为WHERE子句建议的索引之外,我还为GROUP BY子句添加了一个索引。但是当查询运行时,它只使用where子句的索引而不使用group子句的索引。 – Mayank

0

我认为这是最好的指标:

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 
+0

感谢Rick的反馈,我会尝试你的两个建议并看到改进之处,同时检查你提到的可能的错误。 – Mayank