如何在MySQL中加快缓慢的SUM + ORDER BY + LIMIT查询?

时间:2013-03-20 16:20:39

标签: mysql performance

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

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

1 个答案:

答案 0 :(得分:2)

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

此类查询的主要问题是group by需要在一个订单中编制索引,order by需要按不同的顺序排序。