2

我有一个包含两个字段的简单键值表,创建如下:

 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 秒内运行!有人知道为什么吗?

4

1 回答 1

2

据我所知,真正加快速度的唯一方法是创建一个带有唯一键的单独表并维护总值。然后您将能够索引值以快速检索前十名,并且计算已经完成。只要表格没有在太多地方更新,这应该不是一个大问题。

这种查询的主要问题是group by需要按一个顺序建立索引,而order by需要按不同的顺序排序。

于 2013-03-20T16:37:48.633 回答