MYSQL从包含100万行的表中选择distinct(indexed_column)

时间:2011-02-25 11:08:56

标签: mysql optimization

编辑: 实际上除了select distinct(我尚未验证)之外,主要的性能瓶颈可能是网络速度,当服务器和客户端都在localhost上时, 选择所有2个百万条记录需要36秒,但是,在一个(据称是高速)网络上,客户端坐在另一个盒子上,10分钟后查询还没有完成。
这可能是100mbps网络,但当我检查了客户端(java jdbc),它以3kb /秒的速率接收数据。但是,mysql服务器以100kb /秒的速度发送(包括其他客户端连接)。 为什么java jdbc客户端以如此低的速率接收数据?

select distinct(indexed_column) from mytable

在mytable上只有100万行非常慢,indexed_column是一个非唯一索引。 有没有办法优化它? 解释给出了这个:

id | select_type | table        | type  | possible_keys | key               | key_len | ref  | rows    | Extra     
|  1 | SIMPLE      | mytable | range | NULL          | my_index | 50      | NULL | 1759002 | Using index for group-by | 

type = range意味着它没有使用索引?这就是为什么它很慢?

1 个答案:

答案 0 :(得分:0)

我会在表格上建立一个唯一索引,在你希望“DISTINCT”的列上...

因此,您在给定列上寻找DISTINCT。如果您在一列(或多列)上构建UNIQUE INDEX,那么您正在寻找不同的组合,索引页面将只保留指向符合此类组合条件的第一条记录的指针。

例如:如果你有

Category   Count
1          587
2          321
3          172
4          229
5          837

你的UNIQUE INDEX类别只有5条记录......在这种情况下,即使5个类别中超过2,000个条目,DISTINCT CATEGORY计数为5,索引也为5,你就完成了。将此概念应用于您的1百万+记录表。