MySQL:GROUP BY上的索引

时间:2011-09-21 22:48:24

标签: mysql indexing

我有一个相当大的桌子(> 10.000行),它会快速增长。在此表中,我运行以下查询:

SELECT *, MAX(a) FROM table GROUP BY b, c, d

目前EXPLAIN告诉我没有键,没有可能的键,它是“使用临时;使用filesort”。这样一张桌子最好的关键是什么?

3 个答案:

答案 0 :(得分:4)

复合键b+c+d+a怎么样?

顺便说一下,如果你有SELECT *

GROUP BY没有任何意义

答案 1 :(得分:2)

如果适用,字段b,c,d的主要索引会很好 在那种情况下,你只需要做一个

SELECT * FROM table1 
group by <insert PRIMARY KEY here> 

如果没有在b,c,d。上添加索引 也许在一个,取决于性能。

如果b,c,d始终一致使用,则在所有三个上使用复合索引。

非常重要!始终声明主键。如果没有它,InnoDB上的性能将会很糟糕。

要详细说明@zerkms,您只需将这些列放在group by子句中,该子句完全定义您选择的行。
如果您select *可能没问题,但不需要max(a),也不需要组。
另请注意,max(a)可能来自与其他字段不同的行。

唯一有意义的用例是:

select t1.*, count(*) as occurrence from t1 
inner join t2 on (t1.id = t2.manytoone_id) 
group by t1.id

其中t1.id是PK。

我认为你需要重新考虑这个问题。
用真实的代码提出一个新的问题来解释你想要的东西 并确保提问how to make the outcome确定, so that all values shown are functionally dependent on the group by clause

答案 2 :(得分:1)

最终有效的是对查询的修改如下:

SELECT b, c, d, e, f, MAX(a) FROM table GROUP BY b, c, d

在(b,c,d,e,f)上创建索引。

非常感谢您的帮助:这里的提示非常有用。