【问题标题】:Speeding up GROUP BY, SUM and AVG queries加速 GROUP BY、SUM 和 AVG 查询
【发布时间】:2012-07-24 12:58:10
【问题描述】:

在我的测试机器上,表 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. 使用应用程序的业务层复制数据是否更好?

【问题讨论】:

    标签: mysql performance


    【解决方案1】:

    为了在 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. 选择中使用的列。

    详情请访问:Group By Optmization in MySQL

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

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

    【讨论】:

    • 通过使用正确的索引从 10 分钟下降到 0.7 秒。
    • 连接的顺序在哪里?
    • Join 也可以写成 where 子句查询。因此,连接首先按索引顺序排列,然后按顺序分组、排序、选定列。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多