我有一个相当大的桌子(> 10.000行),它会快速增长。在此表中,我运行以下查询:
SELECT *, MAX(a) FROM table GROUP BY b, c, d
目前EXPLAIN告诉我没有键,没有可能的键,它是“使用临时;使用filesort”。这样一张桌子最好的关键是什么?
答案 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)上创建索引。
非常感谢您的帮助:这里的提示非常有用。