3

在我的测试机器上,表 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;

此查询从风力涡轮机数据中提供每日平均风速和总功率。STE_ID在我的测试机器上,这个查询在, PNT_NO, YR,上的组合索引执行 10 分钟后超时MN,这只是主键列的一个子集。如果没有索引,查询将在几分钟后完成。

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

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

1 回答 1

14

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

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

对于覆盖索引,您添加:

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

详情请访问:MySQL 中的 Group By Optimization

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

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

于 2012-07-24T13:03:59.290 回答