MYSQL distinct 和group by 同时使用性能急剧下降

小明 2025-05-05 07:48:20 4

��句: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_脚本之家

explain select city ,count(*) as num from staff group by city;

我们一起来看下这个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 效率则更高。

The End
微信