【问题标题】:MySQL - Index to speed up queries with aggregate functionsMySQL - 使用聚合函数加速查询的索引
【发布时间】:2011-11-23 08:55:52
【问题描述】:

据我了解,典型数据库表上的索引将提供更有效的行查找。是否存在用于使聚合函数查询更有效的类似结构?

举个例子,假设我有一个像下面这样的表格,里面有很多行

Employees
employeeId | office | salary

SELECT office, MAX(salary)
FROM Employees
GROUP BY office

我想有效地检索每个办公室员工的MAX() 工资。在这种情况下,我不介意额外的插入/更新开销,因为我会经常进行此查询,而不是经常写入表。

我的引擎是 MySQL 上的 MyISAM

【问题讨论】:

  • 除了在其他地方手动跟踪最大值之外,我没有看到任何解决办法。
  • 我想在salary 上添加一个索引会加速聚合函数MAX(salary)。不是吗?
  • @rfausak: 不,单个字段salary 索引根本没有帮助
  • @JohnFx:在这种情况下,clustered 索引如何优于常规索引(office + salary one)?
  • @JohnFx:顺便说一句,他使用myisam,所以他没有定义聚集索引

标签: mysql sql database-indexes


【解决方案1】:

使用 EXPLAIN 查看查询执行计划。然后添加索引,检查查询执行计划是否有改善。

您也可以使用分析:

mysql> SET profiling=ON;
mysql> SELECT…
mysql> SET profiling=OFF;
mysql> SHOW PROFILES;
mysql> SHOW PROFILE FOR QUERY 1;

分区还可以提高查询的性能。

【讨论】:

    【解决方案2】:

    复合索引office + salary 是您能做的最好的(如果您不想只将预先计算的最大值存储在另一个表中)。

    【讨论】:

      【解决方案3】:

      发现这个正在寻找另一个问题,但这里应该是给定问题的解决方案:

      MySQL 文档指出,如果您在查询中使用 MAX() 或 MIN() 作为唯一的聚合函数,则按优化分组有效。在这种情况下,您的分组依据字段必须是最左侧的索引部分。

      在您的情况下,索引(办公室、薪水)应该可以解决问题。

      这里是文档:https://dev.mysql.com/doc/refman/5.5/en/group-by-optimization.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-17
        • 2015-08-31
        相关资源
        最近更新 更多