我有一个包含两个字段的简单键值表,创建如下:
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;
但这非常慢。问题是,没有 GROUP BY 和 SUM,它非常快,没有 ORDER BY,它非常快,但由于某种原因,两者的结合使它非常慢。谁能解释为什么会这样,以及如何加快速度?
没有价值指数。我尝试创建一个,但没有帮助。
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 秒内运行!有人知道为什么吗?