本文主要是介绍MYSQL distinct 和group by 同时使用性能急剧下降,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
语句:select distinct a from A group by a
当记录数上万,执行时间将达到30秒左右。
修改为 select distinct a from (select a from A group by a),执行时长会在1秒以内。
对比两条SQL 语句执行记录,发现修改前Handler_read_rnd_next 数量高达1亿,修改后这条记录降低到7万左右。
Handler_read_rnd_next: 从数据节点读取下一条数据的次数 。
另外修改后,解释器中增加了Using temporary,使用了临时表进行distinct 操作。
为什么会出现这种情况呢?
按照网上说法,distinct 和group by 同时使用时,先group by ,再distinct 。这个过程中,group by 应该必然会产生临时表才对。
Mysql数据库group by原理详解_Mysql_脚本之家
|
我们一起来看下这个SQL的执行流程哈
- 创建内存临时表,表里有两个字段city和num;
- 全表扫描staff的记录,依次取出city = 'X'的记录。
- 判断临时表中是否有为 city='X'的行,没有就插入一个记录 (X,1);
- 如果临时表中有city='X'的行的行,就将x 这一行的num值加 1;
- 遍历完成后,再根据字段city做排序,得到结果集返回给客户端。
distinct :会将全部内容存储到一个hash结构中,最后通过计算hash结构中的key的个数得到结果。典型的以空间换时间的方式。
group by:先将字段排序,一般使用sort,然后进行计数,典型的以时间换空间。
数据越是离散,distinct 需要消耗的空间越大,效率越低,group by 的空间优势就比较明显;数据越集中,distinct 效率则更高。
这篇关于MYSQL distinct 和group by 同时使用性能急剧下降的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!