我有一个包含两个字段的简单键值表,如下所示:
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秒内运行!任何人都知道为什么?
答案 0 :(得分:2)
据我所知,真正加快速度的唯一方法是创建一个单独的表,其中包含唯一键并保持总值。然后,您将能够索引值以快速检索前十名,也将完成计算。只要表格没有在太多地方更新,这不应该是一个主要问题。
此类查询的主要问题是group by
需要在一个订单中编制索引,order by
需要按不同的顺序排序。