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

问题描述:

我有两个领域,像这样创建了一个简单的键 - 值表:如何加快MySQL中缓慢的SUM + ORDER BY + LIMIT查询?

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产生在工作台下面:

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

你有价值指数吗? – Pete 2013-03-20 16:24:50

+1

您能否为我们提供该查询的'EXPLAIN EXTENDED'输出? – Adrian 2013-03-20 16:25:55

+0

查询将生成一个中间表,然后对其进行排序。我怀疑缓慢的位是排序,虽然都不会很快。你有多少个独特的钥匙?您将无法有效地索引值,因为您正在计算它作为查询的一部分。 – Jaydee 2013-03-20 16:31:34

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

这种类型的查询的主要问题是group by需要索引一个顺序和order by需要排序到不同的顺序。

+0

Jaydeep,所以我们需要每次在主表中记录更改时更新新表中的记录。我们可以使用触发器或其他东西来实现这一点吗? – kishan 2015-05-11 12:38:28