mysql与600万行不同需要17分钟才能运行?我可以加快速度吗?

时间:2009-10-29 18:02:55

标签: mysql distinct

我正试图从600万行表中获取不同的id。查询非常简单,解释似乎没问题。 distict行被索引为uid-date-time的分组索引的一部分。

查询

SELECT DISTINCT uid FROM events;

并在17分15.54秒内返回334117行。

解释是

+----+-------------+-------------+-------+---------------+----------------+----
----+------+------+--------------------------+
| id | select_type | table       | type  | possible_keys | key            | keylen | ref  | rows | Extra                    |
+----+-------------+-------------+-------+---------------+----------------+--------+------+------+--------------------------+
|  1 | SIMPLE      | events     | range | NULL          | dateuid_idx      | 4     | NULL |   10 | Using index for group-by |
+----+-------------+-------------+-------+---------------+----------------+----
----+------+------+--------------------------+
如果uid以单独的索引保存,那么这会更快吗? 还是有另一种方法可以加快速度吗?

4 个答案:

答案 0 :(得分:2)

它看起来像你的索引按日期,然后UID没有帮助。首先通过UID索引或为UID建立单独的索引将大大提高性能。

此外,您可以考虑using GROUP BY instead of DISTINCT

答案 1 :(得分:2)

是的,将uid作为单独的索引可以更快。如果没有索引,则需要进行全表扫描;也就是说,它实际上遍历每一行并检查是否已经选择了特定的uid。

然而,如果uid是一个索引,它只需要遍历索引树,如果有很多重复的uid,这可以快得多。

答案 2 :(得分:1)

在uid上创建索引

答案 3 :(得分:0)

单独的uid索引可以加快速度。 然而,创建索引可能需要17分钟(因为必须完成大约相同数量的“读取”才能创建索引。

因此,创建这样的索引都取决于预期的用法。如果相关查询运行几次(如果仅在当前重复记录搜索的“活动”期间),则可能是一个很好的“投资”。