[英]Make mysql query faster
我有这个查询需要大约 29 秒来执行并且需要使它更快。 我已经在aggregate_date 列上创建了索引,但仍然没有真正的改进。 每个aggregate_date 在表中有近26k 行。 查询将从 2018 年 1 月 1 日开始运行到昨天的另一件事
select MAX(os.aggregate_date) as lastMonthDay,
os.totalYTD
from (
SELECT aggregate_date,
Sum(YTD) AS totalYTD
FROM tbl_aggregated_tables
WHERE subscription_type = 'Subcription Income'
GROUP BY aggregate_date
) as os
GROUP by MONTH(os.aggregate_date), YEAR(os.aggregate_date);
我使用了 Explain Select ... 并收到了以下内容
更新
大部分查询时间被内部查询消耗,所以正如 scaisEdge 建议的那样,我已经测试了查询,时间减少到近 8 秒。 内部查询将如下所示:
select agt.aggregate_date,SUM(YTD)
from tbl_aggregated_tables as agt
FORCE INDEX(idx_aggregatedate_subtype_YTD)
WHERE agt.subscription_type = 'Subcription Income'
GROUP by agt.aggregate_date
我注意到这种比较“WHERE agt.subscription_type = 'Subcription Income'”花费了大部分时间。 那么有什么方法可以改变这一点,需要提到的是,subscription_type 列只有 2 个值,即“订阅收入”和“订阅单位”
aggregate_date
列上的索引对性能没有帮助,因为不涉及 where 条件
查看您的代码,一个有用的索引应该在列subscription_type
您可以尝试使用冗余索引添加 select 子句中涉及的列(尝试从索引获取查询中的所有数据,避免访问表),因此您的索引可能是
create idx1 on tbl_aggregated_tables (subscription_type, aggregate_date, YTD )
最后一个 group by 的意思似乎与 select 子句不一致
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.