加速GROUP BY,SUM和AVG查询

klo*_*onq 2 mysql performance

表arg_rec在我的测试机器上包含800K行,通常这个表将保存超过15M行.我想运行以下查询:

SELECT STE_ID, PNT_NO, YR, MN, AVG(AVR_WS) AS AVR_WS, SUM(AVR_PW) FROM arg_rec GROUP BY STE_ID, PNT_NO, YR, MN;
Run Code Online (Sandbox Code Playgroud)

该查询给出了风力涡轮机数据的日平均风速和总功率.在我的测试机这个查询超时10分钟,在一个组合索引执行后STE_ID,PNT_NO,YR,MN,这是唯一的主键列的子集.如果没有索引,查询将在几分钟后完成.

我运行的几乎是MySQL的安装,除了调整服务器之外,我还想了解更多有关处理此问题的其他方法,例如:

  1. 是否可以基于此查询创建视图并缓存结果?
  2. 是否有更先进的索引功能来封装YR,MN,DY,HR,MI,SC对应于记录时间戳的年,月,日等字段的事实?
  3. 我最好只使用我的应用程序的业务层复制数据?

Ome*_*esh 9

为了在GROUP BY查询中获得最佳性能,您必须添加覆盖索引:

ALTER TABLE arg_rec ADD KEY ix1(STE_ID, PNT_NO, YR, MN,AVR_WS, AVR_PW );
Run Code Online (Sandbox Code Playgroud)

对于覆盖索引,您添加:

  1. 首先在where子句中使用的列
  2. 然后,在group by中使用的列
  3. 按顺序使用的列,然后
  4. select中使用的列.

访问详情:在MySQL中通过Optmization分组

  1. 您可以通过在查询缓存配置中启用查询缓存抢占来缓存MySQL中的查询

  2. 您可以将YR,MN,DY,HR,MI,SC存储在具有数据类型的单个列中,TIMESTAMP这样可以提高索引和分组操作的性能.

  • 通过使用适当的索引从10分钟下降到0.7秒. (4认同)