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 了
至于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中的integer 数据类型
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复
- MySQL 优化
- MySQL 数据类型
- Facebook's New Real-time Messaging System: HBase to Store 135+ Billion Messages a Month