编辑:
实际上除了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意味着它没有使用索引?这就是为什么它很慢?
答案 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百万+记录表。