据我所知,典型数据库表上的索引将提供更有效的行查找。是否存在类似的构造以使聚合函数的查询更有效?
作为一个例子,假设我有一个像下面这样有大量行的表
Employees
employeeId | office | salary
SELECT office, MAX(salary)
FROM Employees
GROUP BY office
我想从每个办公室有效地检索员工的MAX()
薪水。在这种情况下,我不介意额外的插入/更新开销,因为我将经常进行此查询,而不是经常写入表。
我的引擎是MySQL上的MyISAM
答案 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