加速GROUP BY,SUM和AVG查询

时间:2012-07-24 12:58:11

标签: 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;

此查询提供风力涡轮机数据的每日平均风速和总功率。在我的测试计算机上,此查询在执行10分钟后超时STE_IDPNT_NOYRMN,这只是主要的子集关键栏目。没有索引,查询会在几分钟后完成。

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

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

1 个答案:

答案 0 :(得分:9)

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

ALTER TABLE arg_rec ADD KEY ix1(STE_ID, PNT_NO, YR, MN,AVR_WS, AVR_PW );

要覆盖索引,请添加:

  1. 首先在where子句中使用的列,然后是
  2. 分组中使用的列,然后
  3. 按顺序使用的列,然后
  4. select中使用的列。
  5. 访问详情:Group By Optmization in MySQL

    1. 您可以在Query Cache Configuration启用查询缓存抢劫来缓存MySQL中的查询

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