MySQL 中的 distinct 和 group by 的性能比较

49 篇文章 2 订阅
订阅专栏
30 篇文章 2 订阅
订阅专栏
在有索引的情况下,groupby和distinct效率相同,因为它们都能使用索引。但在无索引时,distinct通常比groupby效率高,因为groupby可能进行隐式排序导致filesort。MySQL8.0之前,groupby会默认隐式排序,但从8.0开始已移除这一行为,使得两者在无索引时效率接近。groupby在复合业务处理和数据过滤上更灵活,能配合聚合函数和having子句使用。
摘要由CSDN通过智能技术生成

1 先说大致的结论(完整结论在文末)

  • 在语义相同,有索引的情况下:group by和 distinct 都能使用索引,效率相同。

  • 在语义相同,无索引的情况下:distinct 效率高于group by。原因是 distinct 和 group by都会进行分组操作,但group by可能会进行排序,触发 filesort,导致 sql 执行效率低下。

基于这个结论,你可能会问:

  • 为什么在语义相同,有索引的情况下,group by和 distinct 效率相同?

  • 在什么情况下,group by会进行排序操作?

带着这两个问题找答案。接下来,我们先来看一下 distinct 和group by的基础使用。

2 distinct 的使用

2.1 distinct 用法

SELECT DISTINCT columns FROM table_name WHERE where_conditions;

例如:

select DISTINCT age from employee;

输出:

DISTINCT 关键词用于返回唯一不同的值。放在查询语句中的第一个字段前使用,且作用于主句所有列。

如果列具有 NULL 值,并且对该列使用DISTINCT子句,MySQL 将保留一个 NULL 值,并删除其它的 NULL 值,因为DISTINCT子句将所有 NULL 值视为相同的值。

2.2 distinct 多列去重

distinct 多列的去重,则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。

SELECT DISTINCT columns FROM table_name WHERE where_conditions;

例如:

select DISTINCT age, manager from employee;

输出:

3 group by 的 使用

对于基础去重来说,group by 的使用和 distinct 类似。

3.1 单列去重

语法:

SELECT columns FROM table_name WHERE where_conditions GROUP BY columns;

例如:

SELECT age FROM employee GROUP BY age;

输出:

3.2 多列去重

语法:

SELECT columns FROM table_name WHERE where_conditions GROUP BY columns;

例子:

SELECT age, manager FROM employee GROUP BY age, manager;

输出:

3.3 区别示例

两者的语法区别在于,group by可以进行单列去重,group by的原理是先对结果进行分组排序,然后返回每组中的第一条数据。且是根据group by的后接字段进行去重的。

例如:

SELECT age, manager FROM employee GROUP BY age;

输出:

4 distinct 和 group by 原理

在大多数例子中,DISTINCT可以被看作是特殊的GROUP BY,它们的实现都基于分组操作,且都可以通过松散索引扫描、紧凑索引扫描(关于索引扫描的内容会在其他文章中详细介绍,就不在此细致介绍了)来实现。

DISTINCT和GROUP BY都是可以使用索引进行扫描搜索的。例如以下两条 sql(只单单看表格最后 extra 的内容),我们对这两条 sql 进行分析,可以看到,在 extra 中,这两条 sql 都使用了紧凑索引扫描Using index for group-by。

所以,在一般情况下,对于相同语义的DISTINCT和GROUP BY语句,我们可以对其使用相同的索引优化手段来进行优化。

但对于GROUP BY来说,在 MYSQL8.0 之前,GROUP Y默认会依据字段进行隐式排序。

可以看到,下面这条 sql 语句在使用了临时表的同时,还进行了 filesort。

5 隐式排序

5.1 对于隐式排序,我们可以参考 MySQL 官方的解释:

https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

GROUP BY implicitly sorts by default (that is, in the absence of ASC or DESC designators for GROUP BY columns). However, relying on implicit GROUP BY sorting (that is, sorting in the absence of ASC or DESC designators) or explicit sorting for GROUP BY (that is, by using explicit ASC or DESC designators for GROUP BY columns) is deprecated. To produce a given sort order, provide an ORDER BY clause.

大致解释一下:

GROUP BY 默认隐式排序(指在 GROUP BY 列没有 ASC 或 DESC 指示符的情况下也会进行排序)。然而,GROUP BY 进行显式或隐式排序已经过时(deprecated)了,要生成给定的排序顺序,请提供 ORDER BY 子句。

所以,在 MySQL8.0 之前,GROUP BY会默认根据作用字段(GROUP BY的后接字段)对结果进行排序。在能利用索引的情况下,GROUP BY不需要额外进行排序操作;但当无法利用索引排序时,MySQL 优化器就不得不选择通过使用临时表然后再排序的方式来实现GROUP BY了。

且当结果集的大小超出系统设置临时表大小时,MySQL 会将临时表数据 copy 到磁盘上面再进行操作,语句的执行效率会变得极低。这也是 MySQL 选择将此操作(隐式排序)弃用的原因。

5.2 基于上述原因,Mysql 在 8.0 时,对此进行了优化更新:

https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html

Previously (MySQL 5.7 and lower), GROUP BY sorted implicitly under certain conditions. In MySQL 8.0, that no longer occurs, so specifying ORDER BY NULL at the end to suppress implicit sorting (as was done previously) is no longer necessary. However, query results may differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

大致解释一下:

从前(MySQL5.7 版本之前),Group by 会根据确定的条件进行隐式排序。在 MySQL 8.0 中,已经移除了这个功能,所以不再需要通过添加 order by null 来禁止隐式排序了,但是,查询结果可能与以前的 MySQL 版本不同。要生成给定顺序的结果,请按通过 ORDER BY指定需要进行排序的字段。

6 结论

根据上述描述,我们的结论也就出来了

  • 在语义相同,有索引的情况下: group by和 distinct 都能使用索引,效率相同。因为group by和distinct近乎等价,distinct 可以被看做是特殊的group by。

  • 在语义相同,无索引的情况下: distinct效率高于group by。原因是distinct 和 group by都会进行分组操作,但group by在 MySQL8.0 之前会进行隐式排序,导致触发 filesort,sql 执行效率低下。但从 MySQL8.0 开始,MySQL 就删除了隐式排序,所以,此时在语义相同,无索引的情况下,group by和distinct的执行效率也是近乎等价的。

相比于distinct来说,group by的语义明确。且由于 distinct 关键字会对所有字段生效,在进行复合业务处理时,group by的使用灵活性更高,group by能根据分组情况,对数据进行更为复杂的处理,例如通过having对数据进行过滤,或通过聚合函数对数据进行运算。

MySQLdistinctgroup by语句的一些比较及用法讲解
09-10
MySQL数据库,`DISTINCT` 和 `GROUP BY` 是两种用于数据去重和分组统计的SQL语句,它们虽然都可以帮助我们处理重复数据,但有着不同的应用场景和执行机制。 1. `DISTINCT` 关键字: - `DISTINCT` 主要用于去除...
MySQLDistinctGroup By语句的基本使用教程
09-10
MySQL数据库,`DISTINCT`和`GROUP BY`是两个非常重要的查询语句,它们在处理数据去重和分组方面发挥着关键作用。本文将详细介绍这两个语句的使用方法。 首先,`DISTINCT`关键字是用来去除查询结果重复记录的...
MySQLdistinctgroup by之间的性能进行比较
09-10
主要针对MySQLdistinctgroup by之间的性能进行比较,内容比较详细,很直观的能看出比较结果,感兴趣的小伙伴们可以参考一下
mysql distinct row_mysql distinctgroup by谁更好
weixin_39639919的博客
01-19 395
今天无意听到有同事在讨论,distinctgroup by谁的速度会更快一点,意件不一,其实我也不知道那个好,下午有时间做了一下测试。1,测试前的准备//准备一张测试表mysql> CREATE TABLE `test_test` (-> `id` int(11) NOT NULL auto_increment,-> `num` int(11) NOT NULL de...
MySQLdistinctgroup by哪个效率更高?
最新发布
人生若只初相见@的博客
08-16 2520
MySQLdistinctgroup by哪个效率更高?我们一起来学习一下。
mysql distinctgroup by性能
caoliangbo的博客
03-11 155
mysql distinctgroup by性能   1,测试前的准备 查看复制打印? //准备一张测试表    mysql> CREATE TABLE `test_test` (     ->   `id` int(11) NOT NULL auto_increment,     ->   `num` int(11) N...
MySQL distinctgroup by 哪个效率更高?
旷野历程
08-02 1651
在需要去除重复值而不需要聚合的情况下,可以使用 DISTINCT 来代替简单的 GROUP BY,以避免不必要的聚合操作,从而提高性能。因为它仅仅关注去除重复值,而不需要对数据进行聚合操作。在需要分组和聚合数据的情况下,GROUP BY 是更合适的选择。最终的选择应该根据你的具体业务需求和性能测试结果来决定,而且性能上的差异还取决于查询的复杂性、表的大小、索引的使用等因素。
去重是distinct还是group by?
热门推荐
梁吉林的博客
04-24 10万+
distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分,因为用错场景的话,效率相差可以倍计。单纯的去重操作使用distinct,速度是快于group by的。distinctdistinct支持单列、多列的去重方式。 单列去重的方式简明易懂,即相同值只保留1个。 多列的去重则是根据指定的去重的列信息来进行,即只有
Mysqldistinctgroup by的去重方面的区别
12-14
MySQL数据库,`DISTINCT` 和 `GROUP BY` 是两个非常重要的SQL关键字,它们都可以用来处理数据的去重问题,但在实际应用,两者的使用场景和效果有所差异。 首先,`DISTINCT` 关键字的主要作用是去除查询结果...
distinct效率更高还是group by效率更高?
猾枭的博客
06-29 1万+
原创文章,希望多多关注支持,感谢。 目录 00 结论 01 distinct的使用 02 group by的使用 03 distinctgroup by原理 * 04 推荐group by的原因 00结论 先说大致的结论(完整结论在文末): 在语义相同,有索引的情况下 group by和distinct都能使用索引,效率相同。 在语义相同,无索引的情况下: distinct效率高于group by。原因是distinctgroup by都会进行分组操作,但group by可能会进行排序,触发fil
distinct mysql性能_mysql distinctgroup by性能
weixin_29790175的博客
02-01 305
查看复制打印?//准备一张测试表mysql>CREATETABLE`test_test`(->`id`int(11)NOTNULLauto_increment,->`num`int(11)NOTNULLdefault'0',->PRIMARYKEY(`id`)->)ENGINE=MyISAMDEFAULTCHAR...
group by 与 distinct去重性能
chi_666的博客
07-16 307
因为GROUP BY可以即时去重,而DISTINCT需要扫描整个数据集,这可能导致更高的内存和I/O开销,尤其是在处理TB级大表时。GROUP BY和DISTINCT数据库查询都可以用于去重,但它们的性能差异取决于多个因素,包括数据集的大小、数据库的结构和索引、以及查询的具体内容。GROUP BY:它可以在数据流即时进行去重处理,通常与聚合函数(如COUNT, SUM等)一起使用,但也可以仅用于去重。DISTINCT:它会扫描整个数据集,然后删除重复的记录,只保留唯一的记录。
distinctgroup by,效率比较
weixin_35757191的博客
02-13 2497
数据库DISTINCTGROUP BY 都是用来过滤重复数据的,但它们的原理和用法是不同的。 DISTINCT 是通过比较每一行数据,仅返回不重复的数据,因此如果数据量较大,DISTINCT 的效率较低。 GROUP BY 是通过分组,将相同的数据分为一组,并对每一组数据进行计算,因此如果数据量较大,GROUP BY 的效率较高。 总的来说,GROUP BY 的效率要优于 DISTIN...
MySQLdistinctgroup by性能比较
YuanLuo0911的博客
04-20 583
在语义相同,有索引的情况下,group by和distinct都能使用索引,效率相同。 在语义相同,无索引的情况下,distinct效率高于group by。
mysqldistinct_MySQLdistinctgroup by性能比较
weixin_31921223的博客
01-18 283
MySQLdistinctgroup by性能比较[转]之前看了网上的一些测试,感觉不是很准确,今天亲自测试了一番。得出了结论(仅在个人计算机上测试,可能不全面,仅供参考)测试过程:准备一张测试表1CREATE TABLE `test_test` (2 `id` int(11) NOT NULL auto_increment,3 `num` int(11) NOT NULL...
group by 效率高还是distinct效率高?你得先看什么数据库
qq_25156781的博客
06-21 833
其实取消这种操作也好,众多数据库也就mysql有这种排序操作,而且只排序第一个group by 子句的字段,对于不需要排序的查询需求,无疑是增加不必要的执行负担。可是group by在不同的数据库语法是区别很大的:比如mysql比较灵活,group by子句的字段和select子句字段关联不大,group by的字段可以出现在select ,也可以不出现。而mysql的排序还是仅限于对紧跟group by的第一个字段进行排序,多字段分组的情况下,除了第一个字段,其他的并不做排序。
MySQL去重:distinct vs group by 实战与性能分析
MySQL数据库,当需要去除重复记录时,常常会遇到选择使用`DISTINCT`关键字还是`GROUP BY`子句来实现去重的问题。本文将深入探讨这两种方法的适用场景、性能差异以及如何在实际操作进行选择。 **1. `DISTINCT`...
写文章

热门文章

  • 使用Visio画出各模型的关系(一对一,多对多,一对多等) 200669
  • Java匹配正则表达式大全 189445
  • 利用Java将word文件转成pdf文件 180181
  • 《Java开发实战经典》.(李兴华).[PDF]&ckook百度网盘链接 176702
  • 怎么使用okhttp的form-data数据类型对接接口 175822

分类专栏

  • Java收费专栏 1篇
  • 考研管综(199) 3篇
  • 数学基础 3篇
  • Java 209篇
  • springboot 52篇
  • mysql 30篇
  • seata
  • Minio 8篇
  • 考研英语 1篇
  • 考研数学 10篇
  • 线性代数 6篇
  • 概率论与数理统计 1篇
  • 高等数学 3篇
  • 数据库 49篇
  • ChatGPT 3篇
  • spring 33篇
  • redis 18篇
  • 其他 2篇
  • 考研408 5篇
  • 计算机网络 2篇
  • 数据结构 3篇
  • 安全加密 5篇
  • Disruptor 3篇
  • Elasticsearch 8篇
  • 微服务 9篇
  • visio 6篇
  • 大数据 2篇
  • 定时器 1篇
  • 多线程 7篇
  • Jvm 6篇
  • 软件测试 1篇
  • 消息队列 7篇
  • netty 1篇
  • mybatis 11篇
  • 职场和发展 3篇
  • 分库分表 1篇
  • 云服务器 1篇
  • WeChat 3篇
  • 日志 2篇
  • effective 3篇
  • jar包 1篇
  • linux 5篇
  • struts 3篇
  • nginx 1篇
  • 前端缓存 2篇
  • hibernate 3篇
  • go 1篇
  • maven 1篇
  • JavaScript 3篇
  • 版本控制工具 4篇
  • 书籍 7篇
  • python 1篇
  • vue 3篇

最新评论

  • 手动编写SpringIOC框架

    CSDN-Ada助手: SpringBoot项目里,如何做异步计算,异步计算超时和异常处理你会怎么做呢?

  • 最强分布式锁工具:Redisson

    回忆过去的童年: 你用的是redisson-starter那个依赖吧,那个依赖可以省略redissonClient的配置

  • MySQL递归查询 三种实现方式

    吴名氏.: hive没咋用过,不是很清楚

  • MySQL递归查询 三种实现方式

    2201_75681058: 大佬,hive好像不行?

  • Java实现简体转繁体字

    溟洵: 看了佬的文章,受益匪浅写的非常详细,通俗易懂图文并茂,看起来非常舒服表情包

大家在看

  • PHP中如何使用三元条件运算符
  • Java | Leetcode Java题解之第430题扁平化多级双向链表 31
  • Python | Leetcode Python题解之第429题N叉树的层序遍历
  • C++ | Leetcode C++题解之第430题扁平化多级双向链表
  • Golang | Leetcode Golang题解之第429题N叉树的层序遍历

最新文章

  • 1998年考研真题英语二(204)阅读理解翻译
  • SpringBoot 监控 SQL 运行情况
  • Java实现简体转繁体字
2024年19篇
2023年133篇
2022年84篇
2021年6篇
2020年15篇
2019年46篇
2018年25篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴名氏.

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家动物玻璃钢人物雕塑参考价玻璃钢抽象雕塑批发随州大型玻璃钢动物雕塑常德玻璃钢卡通座椅雕塑玻璃钢糖果雕塑高效的玻璃钢动物雕塑镇江玻璃钢人物雕塑定制价格邳州商场美陈制作玻璃钢座椅摆件雕塑商场玻璃美陈秦淮美陈商场布置温州玻璃钢雕塑摆件哪里买河南创意玻璃钢雕塑优势湖北园林景观玻璃钢雕塑艺术小品许昌学校校园玻璃钢雕塑公司佛山发光景观玻璃钢雕塑生产厂家济源附近玻璃钢雕塑清远农耕文化玻璃钢人物雕塑玻璃钢红军雕塑哪家正规江苏玻璃钢雕塑制作保山市玻璃钢雕塑设计定做仿生玻璃钢蚂蚁雕塑广州玻璃钢雕塑优势做玻璃钢雕塑用什么做隔离剂东营广场玻璃钢雕塑玻璃钢雕塑厂家有哪些广州商场美陈供货商温州玻璃钢陶瓷雕塑嘉峪关城市玻璃钢雕塑制作芜湖多彩玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化