mysql中group by和distinct对比

示例表:
CREATE TABLE sbtest1 (
id int(11) NOT NULL AUTO_INCREMENT,
k int(11) NOT NULL DEFAULT ‘0’,
c char(120) NOT NULL DEFAULT ‘’,
pad char(60) NOT NULL DEFAULT ‘’,
PRIMARY KEY (id),
KEY k_1(k)
) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8;

对于主键

在这里插入图片描述

可以看到group by使用了主键,而distinct使用了辅助索引k_1

返回结果排列不同,distinct会按数据存放顺序一条条显示,而group by会做个排序
DISTINCT操作只需要找出所有不同的值就可以了。而GROUP BY操作还要为其他聚集函数进行准备工作。从这一点上将,GROUP BY操作做的工作应该比DISTINCT所做的工作要多一些。

但实际上,GROUP BY 效率会更高点,为什么呢?对于DISTINCT操作,它会读取了所有记录,而GROUP BY需要读取的记录数量与分组的组数量一样多,也就是说比实际存在的记录数目要少很多。

数据量小时对比
在这里插入图片描述

数据量大时对比,26W数据
在这里插入图片描述

可以看出,只要是使用了索引group by就会比distinct快很多
但是在没使用到索引的情况下,数据量小的情况下distinct的执行速度要比group by 快许多,
数据量大的情况下group by会稍微比distinct快一些

100W数据下对比
在这里插入图片描述
可以看出数据量越大,group by就会比distinct越快

总结:

  1. distinct会进行扫表,两两对比,所以数据量小的时候执行速度会比group by快
    2.数据量大的时候没有索引的情况下,distinct依然是扫表,对比,而group by会将数据进行排序,分组,最后得到分组的记录数目,所以数据量越大就比越比distinct执行快
    3.使用索引的情况下,索引会在内部记录数据的位置并排序,所以distinct会省去扫表的步骤,直接对比,而group会省去排序的步骤,直接进行分组,获取分组的记录数目,所以只要是使用索引的情况下,group by就会比distinct执行快
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值