位置: 编程技术 - 正文

MySQL中distinct语句的基本原理及其与group by的比较

编辑:rootadmin

推荐整理分享MySQL中distinct语句的基本原理及其与group by的比较,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已。所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。但是,和 GROUP BY 有一点差别的是,DISTINCT 并不需要进行排序。也就是说,在仅仅只是 DISTINCT 操作的 Query 如果无法仅仅利用索引完成操作的时候,MySQL 会利用临时表来做一次数据的“缓存”,但是不会对临时表中的数据进行 filesort 操作。当然,如果我们在进行 DISTINCT 的时候还使用了 GROUP BY 并进行了分组,并使用了类似于 MAX 之类的聚合函数操作,就无法避免 filesort 了。

下面我们就通过几个简单的 Query 示例来展示一下 DISTINCT 的实现。

1.首先看看通过松散索引扫描完成 DISTINCT 的操作:

我们可以很清晰的看到,执行计划中的 Extra 信息为“Using index for group-by”,这代表什么意思?为什么我没有进行 GROUP BY 操作的时候,执行计划中会告诉我这里通过索引进行了 GROUP BY 呢?其实这就是于 DISTINCT 的实现原理相关的,在实现 DISTINCT的过程中,同样也是需要分组的,然后再从每组数据中取出一条返回给客户端。而这里的 Extra 信息就告诉我们,MySQL 利用松散索引扫描就完成了整个操作。当然,如果 MySQL Query Optimizer 要是能够做的再人性化一点将这里的信息换成“Using index for distinct”那就更好更容易让人理解了,呵呵。

2.我们再来看看通过紧凑索引扫描的示例:

这里的显示和通过紧凑索引扫描实现 GROUP BY 也完全一样。实际上,这个 Query 的实现过程中,MySQL 会让存储引擎扫描 group_id = 2 的所有索引键,得出所有的 user_id,然后利用索引的已排序特性,每更换一个 user_id 的索引键值的时候保留一条信息,即可在扫描完所有 gruop_id = 2 的索引键的时候完成整个 DISTINCT 操作。

3.下面我们在看看无法单独使用索引即可完成 DISTINCT 的时候会是怎样:

当 MySQL 无法仅仅依赖索引即可完成 DISTINCT 操作的时候,就不得不使用临时表来进行相应的操作了。但是我们可以看到,在 MySQL 利用临时表来完成 DISTINCT 的时候,和处理 GROUP BY 有一点区别,就是少了 filesort。实际上,在 MySQL 的分组算法中,并不一定非要排序才能完成分组操作的,这一点在上面的 GROUP BY 优化小技巧中我已经提到过了。实际上这里 MySQL 正是在没有排序的情况下实现分组最后完成 DISTINCT 操作的,所以少了 filesort 这个排序操作。

4.最后再和 GROUP BY 结合试试看:

MySQL中distinct语句的基本原理及其与group by的比较

最后我们再看一下这个和 GROUP BY 一起使用带有聚合函数的示例,和上面第三个示例相比,可以看到已经多了 filesort 排序操作了,正是因为我们使用了 MAX 函数的缘故。要取得分组后的 MAX 值,又无法使用索引完成操作,只能通过排序才行了。

mysql distinct和group by谁更好1,测试前的准备

2,测试

上面的1-8是4组数据,并且是没有加索引的,从中我们可以看出,distinct比group by 会好一点点-是2组数据,是加了索引以后的,从中我们可以看出,group by 比distinct 会好一点点一般情况,数据量比较大的表,关联字段都会加索引的,,并且加索引后检索时间只有以前的六分之一左右。

MySQL中distinct与group by语句的一些比较及用法讲解 在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和groupby都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据

mysql 数据库死锁原因及解决办法 死锁(Deadlock)所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去

mysql数据库锁的产生原因及解决办法 数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对

标签: MySQL中distinct语句的基本原理及其与group by的比较

本文链接地址:https://www.jiuchutong.com/biancheng/319725.html 转载请保留说明!

上一篇:MySQL中索引优化distinct语句及distinct的多字段操作(mysql索引优化的方案)

下一篇:MySQL中distinct与group by语句的一些比较及用法讲解

  • 税控盘服务费全额抵扣分录
  • 个体工商户怎么注销
  • 房地产小规模纳税人预缴税款如何填申报表
  • 差额冲销
  • 出差会议纪要模板
  • 缴纳契约计税依据包含增值税吗
  • 报关金额多报了3000美金
  • 财付通转账手续费多少
  • 印花税2021年需要计提吗
  • 个人所得税申报错误如何更正申报
  • 资本公积账务处理案例
  • 预付房租摊销账务处理
  • 物业公司管理费用
  • 差额事业单位的工资是由财政开支吗
  • 购买银行承兑利息收入是否缴纳增值税?
  • 金税盘上报汇总是什么时候
  • 个人能在税务局交社保吗
  • 金税盘忘记清卡了
  • 不动产公告期
  • 购入需要安装的固定资产会计科目
  • 企业发给员工的福利要交税吗
  • 增值税专用发票怎么开
  • 留抵税额怎么入账
  • 电梯管理费属什么类别
  • 年初未交增值税借方怎么处理
  • 企业清算期间账务怎么做
  • 本期预收的货款属于
  • 外贸过程中的银行是什么
  • 戴尔笔记本电脑哪款性价比最高
  • 银行与银行之间转账会计摘要
  • 彭布洛克郡谋杀
  • 新车发生事故报废保险怎么赔付
  • PHP:curl_reset()的用法_cURL函数
  • PHP:pg_fetch_assoc()的用法_PostgreSQL函数
  • 外地企业预缴税款流程
  • 货物退回的会计处理
  • 职教费可以抵扣进项么
  • thinkphp extend
  • 目标检测算法有哪些
  • promise基本使用
  • 购买方如何开具红字发票给销售方
  • 经营一家淘宝店铺,自然就应该做好
  • 调整以前年度销项税怎么填申报表
  • 水电费进项税额转出情形
  • mongodb查询操作
  • 公司控股另一家公司好与坏
  • 固定资产折旧计入什么费用
  • 物业管理费发票备注栏要求
  • 固定成本和变动成本举例
  • 递延税款科目怎样使用
  • 存货抵债如何做分录
  • 收到红字发票如何认证呢
  • 业务招待费可以开专票抵扣吗
  • 加油票和过桥过路费怎么做账
  • 即期外汇交易有风险吗
  • 其他业务支出可以在企业所得税前扣除吗
  • 抵账的车买了什么后果
  • 用友薪资管理怎么取消启用
  • 工会经费能零申报保存不起
  • 固定资产实务训练题目及答案
  • 一条的句子怎么写
  • os x yosemite wifi断线怎么办?yosemite wifi掉线解决详细步骤
  • 苹果电脑mac设备怎么删除
  • sllights.exe - sllights进程是什么意思
  • windows10周年更新
  • ubuntu18.04网络
  • ubuntu chmod
  • 腾讯tp驱动
  • win7系统的分区类型怎么选
  • Win7 64位纯净版无法安装第三方主题的可行破解方法
  • android游戏开发框架
  • .json()
  • Node.js中的事件循环是什么意思
  • 详解金球奖之争
  • python字符串常用的五种方法
  • 为什么发莎
  • 卖废铁分录
  • 季度企业所得税分录
  • 临时增版
  • 沈阳税务局营业时间查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设