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;

对于主键

mysql中group by和distinct对比_第1张图片

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

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

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

数据量小时对比
mysql中group by和distinct对比_第2张图片

数据量大时对比,26W数据
mysql中group by和distinct对比_第3张图片

可以看出,只要是使用了索引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执行快

你可能感兴趣的:(php,mysql,面试题)