【IT168 专稿】由于 GROUP BY 实际上也同样会进行排序操作,而且与 ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作。当然,如果在分组的时候还使用了其他的一些聚合函数,那么还需要一些聚合函数的计算。所以,在GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引。

在 MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。下面我们分别针对这三种实现方式做一个分析。

1.使用松散(Loose)索引扫描实现 GROUP BY

何谓松散索引扫描实现 GROUP BY 呢?实际上就是当 MySQL 完全利用索引扫描来实现 GROUP BY 的时候,并不需要扫描所有满足条件的索引键即可完成操作得出结果。

下面我们通过一个示例来描述松散索引扫描实现 GROUP BY,在示例之前我们需要首先调整一下 group_message 表的索引,将 gmt_create 字段添加到 group_id 和 user_id 字段的索引中:

1 sky@localhost: example08:49:45>createindexidx_gid_uid_gc2 3 ->ongroup_message(group_id,user_id,gmt_create);4 5 Query OK, rows affected (0.03sec)6 7 Records:96Duplicates:0Warnings:08 9 sky@localhost: example09:07:30>dropindexidx_group_message_gid_uid10 11 ->ongroup_message;12 13 Query OK,96rows affected (0.02sec)14 15 Records:96Duplicates:0Warnings:0

然后再看如下 Query 的执行计划:

1 sky@localhost: example09:26:15>EXPLAIN2 3 ->SELECTuser_id,max(gmt_create)4 5 ->FROMgroup_message6 7 ->WHEREgroup_id<108 9 ->GROUPBYgroup_id,user_id\G10 11 ***************************1. row***************************12 13 id:114 15 select_type: SIMPLE16 17 table: group_message18 19 type: range20 21 possible_keys: idx_gid_uid_gc22 23 key: idx_gid_uid_gc24 25 key_len:826 27 ref:NULL28 29 rows:430 31 Extra: Usingwhere; Usingindexforgroup-by32 33 1rowinset(0.00sec)

我们看到在执行计划的 Extra 信息中有信息显示“Using index for group-by”,实际上这就是告诉我们,MySQL Query Optimizer 通过使用松散索引扫描来实现了我们所需要的 GROUP BY 操作。

下面这张图片描绘了扫描过程的大概实现:

要利用到松散索引扫描实现 GROUP BY,需要至少满足以下几个条件:

◆GROUP BY 条件字段必须在同一个索引中最前面的连续位置;

◆在使用GROUP BY 的同时,只能使用 MAX 和 MIN 这两个聚合函数;

◆如果引用到了该索引中 GROUP BY 条件之外的字段条件的时候,必须以常量形式存在;

为什么松散索引扫描的效率会很高?

因为在没有WHERE子句,也就是必须经过全索引扫描的时候, 松散索引扫描需要读取的键值数量与分组的组数量一样多,也就是说比实际存在的键值数目要少很多。而在WHERE子句包含范围判断式或者等值表达式的时候, 松散索引扫描查找满足范围条件的每个组的第1个关键字,并且再次读取尽可能最少数量的关键字。

mysql group原理_MySQL Group By 实现原理分析相关推荐

  1. mysql注入原理_Mysql报错注入原理分析

    报错类型Duplicate entry报错:多次查询插入重复键值导致count报错从而在报错信息中带入了敏感信息. Xpath报错:从mysql5.1.5开始提供两个XML查询和修改的函数,语法错误导 ...

  2. mysql show 原理_mysql事务的实现原理

    此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中  有一个整体的认识,如下图 如上图所示, ...

  3. Mysql drop table 原理_mysql事务的实现原理

    此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中 有一个整体的认识,如下图 如上图所示,M ...

  4. mysql 数据库事务处理_MySQL数据库事务及其原理

    基本概念 MySQL 事务主要用于处理操作量大,复杂度高的数据. 银行转账是经典的解释事务的例子.用户A给用户B转账5000元主要步骤可以概括为如下两步. 第一,账户A账户减去5000元: 第二,账户 ...

  5. mysql 只读账号_MySql主从复制,从原理到实践!

    本文将从MySql主从复制的原理出发,详细介绍MySql在Docker环境下的主从复制搭建,以一个主实例和一个从实例实现主从复制为例. 什么是主从复制? 主从复制是指将主数据库的DDL和DML操作通过 ...

  6. mysql mgr简介_MySQL Group Replication(MGR)使用简介与注意事项

    MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供.MGR基于分布式paxos协议,实现组复制,保证数据 ...

  7. mysql 一致性读_MySQL半一致性读原理解析-从源码角度解析

    1.什么是半一致性读 A type of read operation used for UPDATE statements, that is a combination of read commit ...

  8. mysql权限系统的工作原理_Mysql权限系统工作原理

    MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来授予权限. MyS ...

  9. mysql主从同步原理_mysql主从同步以及原理

    mysql主从复制介绍 当前的生产工作中,大多数应用的mysql主从同步都是异步的复制方式,即不是严格实时的数据同步. 实时和异步: 同步复制: 指的是客户端连接到MySQL主服务器写入一段数据,My ...

最新文章

  1. 线性时间查找固定频率的元素
  2. Appium 与 Chromedriver
  3. Flask框架从入门到精通之参数配置(二)
  4. 7系统软raid_使用图形界面来配置RAID
  5. redis安装190923课堂版
  6. 排序算法之交换排序(冒泡排序、快速排序)
  7. Linux之lastb命令
  8. 聊聊我是如何编程入门的
  9. C语言函数参数传递详解
  10. Python可视化matplotlib07-更靓的单颜色(二)
  11. ObjectARX开发(自定义块以及属性的获取)
  12. 二叉排序树中查找效率最高的是
  13. 基于CocosCreator的切水果小游戏(二)
  14. 判断ios系统、qq浏览器,iosqq内置浏览器,微信内置浏览器
  15. 云服务器搭建好,出现 拒绝了我们的连接请求。
  16. 战地4 网页服务器地址,战地4修改的服务器地址
  17. python批量打印网页_web 批量打印
  18. win7系统安装信息服务器不可用怎么办,win7系统rpc服务器不可用怎么办
  19. pwd和$PWD的联系与区别
  20. QTabWidget

热门文章

  1. Guava的Collections2:过滤和转换Java集合
  2. 与JodaTime的DateTime和Google Guava的供应商嘲笑
  3. 拥有成本分析:Oracle WebLogic Server与JBoss
  4. JBoss AS 7.1.0.Final“ Thunder”发布-Java EE 6 Full Profile认证!
  5. Java并发教程–信号量
  6. 将JavaFX 2.0与Swing和SWT集成
  7. Java Persistence API:快速入门
  8. 真正的模块化Web应用程序:为什么没有开发标准?
  9. tomcat如何查找请求资源的?
  10. Mac OS 查看系统版本信息/硬件信息的命令