您的位置:首页 > 大数据

mysql如何优化大数据量情况下的distinct

2015-06-17 17:27 288 查看
在mysql的优化中,有一条是:大量的排序操作影响系统性能,所以尽量减少排序操作。GROUP BY、ORDER BY、 ROLLUP、DISTINCT等都会产生排序。少用DISTINCT!

至于DISTINCT为什么效率低上面兄弟们说的已经很明白了,我这里不说了。我主要说一下用什么方法尽量替代DISTINCT。用EXISTS代替DISTINCT。EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。

低效率:

select distinct userid,username from user,userinfo where user.userid=userinfo.userid

高效率:

select userid,username from user where exists (select 'T' from userinfo where userinfo.userid=user.userid)

其中T的意思是:

因为exists只是看子查询是否有结果返回,而并不关心返回的是什么内容,因此通常建议写一个常量,至少性能不可能比select 一个具体的字段出来差,而某些情况下,select具体的字段出来性能可能比select 一个常量出来要差得多。

你可以在大数据量的数据库里测试一下上面的sql。不过以上方案仅适合userid为唯一主键的情况。

评论 (0) • 链接 •
2012-03-06

Distinct是比较耗效率的,但是和它差不多的group by也一样耗效率,但具体要用哪一种,就要看业务了。这里说说Distinct和group by在MySQL里的实现:

在MySQL里DISTINCT和GROUP BY操作的实现原理很相似,区别在于GROUP BY在分组之后的每组中只取出一条记录。所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。但是,和 GROUP BY 有一点差别的是,DISTINCT 并不需要进行排序。也就是说,在仅仅只是 DISTINCT 操作的 Query 如果无法仅仅利用索引完成操作的时候,MySQL
会利用临时表来做一次数据的“缓存”,但是不会对临时表中的数据进行 filesort 操作。当然,如果我们在进行 DISTINCT 的时候还使用了 GROUP BY 并进行了分组,并使用了类似于 MAX 之类的聚合函数操作,就无法避免 filesort 了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql