2012-07-24 159 views
2

表arg_rec在我的测试机器上包含800K行,通常这个表将保存超过15M行。我想运行以下查询:加快GROUP BY,SUM和AVG查询

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_NO,YR,MN,它只是主键列的一个子集。在没有索引的情况下,查询在几分钟后完成。

我有相当多股票MySQL安装运行,除了调整我也想更多地了解其他的方法来处理这个问题,如服务器:

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

回答

8

通过查询在GROUP最佳的性能,你必须添加覆盖指数:

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

覆盖索引添加:在使用

  1. 列的条款,然后再
  2. 按组使用的列,然后按
  3. 按列顺序依次使用,然后
  4. 在select中使用210
  5. 列。

访问的详细信息:Group By Optmization in MySQL

  1. 您可以通过启用查询缓存战利品在Query Cache Configuration

  2. 可以存储YR缓存在MySQL查询,MN,DY,HR,MI,SC在数据类型为TIMESTAMP的单列中将提高索引和按操作分组的性能​​。

+2

通过使用适当的索引从10分钟下降到0.7秒。 – klonq 2012-07-24 15:37:45

+0

连接按顺序排列在哪里? – 2013-11-15 11:08:20

+0

可以将联接写为where子句查询。因此,连接首先根据索引序列,然后按顺序依次选择列。 – Omesh 2013-11-19 12:05:25