MySQL - 使用聚合函数加速查询的索引

时间:2011-09-23 04:45:17

标签: mysql sql database-indexes

据我所知,典型数据库表上的索引将提供更有效的行查找。是否存在类似的构造以使聚合函数的查询更有效?

作为一个例子,假设我有一个像下面这样有大量行的表

Employees
employeeId | office | salary

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

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

我的引擎是MySQL上的MyISAM

3 个答案:

答案 0 :(得分:2)

使用EXPLAIN查看查询执行计划。然后添加一个索引并检查查询执行计划是否有所改进。

您还可以使用分析:

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

分区也可能会提高查询效果。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

以下文档:https://dev.mysql.com/doc/refman/5.5/en/group-by-optimization.html