MYSQL 从具有 100 万行的表中选择 distinct(indexed_column)
Posted
技术标签:
【中文标题】MYSQL 从具有 100 万行的表中选择 distinct(indexed_column)【英文标题】:MYSQL select distinct(indexed_column) from table with 1 million rows 【发布时间】:2011-02-25 11:08:56 【问题描述】:编辑: 实际上除了 select distinct(我还没有验证),主要的性能瓶颈可能是网络速度,当服务器和客户端都在本地主机上时, 选择所有 200 万条记录需要 36 秒,但是,在(假设是高速)网络上,客户端位于另一个盒子上,10 分钟后查询尚未完成。 这应该是 100mbps 网络,但是当我检查客户端时(java jdbc),它以 3kb/秒的速率接收数据。然而,mysql 服务器以 100kb/sec 的速度发送(尽管包括其他客户端连接)。 为什么java jdbc客户端接收数据的速率这么低?
从 mytable 中选择 distinct(indexed_column)在只有 100 万行的 mytable 上非常慢,indexed_column 是一个非唯一索引。 有没有办法优化它? 一个解释给出了这个:
编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外的 | 1 |简单 |表 |范围 |空 |我的索引 | 50 |空 | 1759002 |使用索引进行分组 |type=range 是否意味着它没有使用索引?这就是它慢的原因吗?
【问题讨论】:
EXPLAIN 对查询计划有什么看法? dev.mysql.com/doc/refman/5.5/en/explain.html 什么是“非常慢”?该列的数据类型是什么? @Frank:这就是全部的解释选择说 @Krtek:数据类型是varchar(50),花了3个小时,还在继续。 3 小时 ??对我来说似乎只有 100 万行是不可能的,你确定数据库没有被锁定或损坏吗? 【参考方案1】:我会在表上建立一个唯一索引,在你想要“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,您就完成了。将此概念应用于包含 100 万多条记录的表。
【讨论】:
实际上我刚刚意识到索引是唯一的,问题是我的数据几乎是不同的(几乎没有重复),我猜是 select distinct 很慢,因为在我将查询更改为 SELECT ,它在 36 秒内完成。 select DISTINCT 从未完成(我在 6 小时后将其杀死),它只有大约 200 万条记录,我不能使用 SELECT DISTINCT? 其实可能是网速问题,请看我的编辑以上是关于MYSQL 从具有 100 万行的表中选择 distinct(indexed_column)的主要内容,如果未能解决你的问题,请参考以下文章
具有 30M 行的表中的 COUNT(*) 和 GROUP BY
具有 10+ 百万行的 MySQL 表 - 如何使用索引加快搜索速度?
当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?