我有一个简单的键值表,有两个字段,创建如下:
CREATE TABLE `mytable` (
`key` varchar(255) NOT NULL,
`value` double NOT NULL,
KEY `MYKEY` (`key`)
);
键不是唯一的。该表包含超过一百万条记录。我需要一个查询,将总结所有的值为一个给定的键,并返回前10个键。这是我的尝试:
SELECT t.key, SUM(t.value) value
FROM mytable t
GROUP BY t.key
ORDER BY value DESC
LIMIT 0, 10;
但是这个非常慢。问题是,没有groupby和SUM,它非常快,没有ORDER BY,它非常快,但由于某种原因,两者的结合使它非常非常慢。有人能解释一下为什么会这样,以及如何加快速度吗?
value上没有索引。我试着创建一个,但没有帮助。
EXPLAIN EXTENDED在Workbench中产生以下内容:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t index NULL MYKEY 257 NULL 1340532 100.00 "Using temporary; Using filesort"
表中大约有400K个唯一键。
查询运行时间超过3分钟。我不知道有多久,因为3分钟后我就停了。然而,如果我删除键上的索引,它在30秒内运行!有人知道为什么吗?
据我所知,真正加快速度的唯一方法是创建一个单独的表,其中包含唯一的键并维护总价值。然后,您将能够索引值以快速检索前十位,并且计算将已经完成。只要表不是在太多的地方更新,这应该不是一个大问题。
这类查询的主要问题是group by
需要按一个顺序索引,而order by
需要按不同的顺序排序。