当前位置: 首页 > news >正文

sql执行流程经典案例分析

        现在有联合索引(a,b),select* form tb where b =xx group by a执行流程是什么样子的?

CREATE TABLE IF NOT EXISTS `test`(`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT'主键',`a` INT(10) NULL,`b` INT(10) NULL,PRIMARY KEY(id),INDEX idx_a_b(a,b))ENGINE = INNODB;INSERT INTO `test`(a,b) VALUES(2,3);INSERT INTO `test`(a,b) VALUES(2,4);INSERT INTO `test`(a,b) VALUES(2,5);INSERT INTO `test`(a,b) VALUES(2,6);INSERT INTO `test`(a,b) VALUES(2,7);INSERT INTO `test`(a,b) VALUES(3,3);INSERT INTO `test`(a,b) VALUES(3,4);INSERT INTO `test`(a,b) VALUES(4,3);INSERT INTO `test`(a,b) VALUES(4,4);EXPLAIN SELECT * FROM `test` WHERE b = 3 GROUP BY a = 3;

        首先是根据b查询,而a和b构建了联合索引,不满足最左匹配原则,不一定会走联合索引,如果查询优化器发现全表扫描的效率低于扫描联合索引的效率的话,就会走联合索引,但是因为不满足最左匹配原则,因此一定会把整个索引树都扫描一遍,取出b = xx的情况, 由于索引 (a, b) 已经按 a 排序,因此可以有效地使用索引顺序扫描来快速对 a 列进行分组。然后根据b取出对应的主键id,进行回表,拿到所有的数据后,创建一个临时的表来存储按a分组的数据,最终返回结果集。

        如果查询优化器发现全表扫描的效率高于扫描联合索引的效率的话,就不会走索引,直接进行全表扫描,查询b=xx的记录,然后将所有记录按a进行分组存入临时表中,返回结果集。

explain执行计划:

执行流程总结(全表扫描索引的情况):

  1. 扫描联合索引 (a, b):MySQL 根据联合索引 (a, b) 找到 b = xx 的所有记录。
  2. a 进行分组:由于联合索引 (a, b) 中的 a 已经排序,MySQL 可以直接根据 a 进行 GROUP BY 操作。
  3. 是否需要回表
    • 如果查询的列全部包含在联合索引中(如 SELECT a, b),则不需要回表。
    • 如果查询需要访问其他列(如 SELECT *),则 MySQL 需要回表,从表中读取完整数据。
  1. 返回结果集:将查询结果返回给客户端。

执行流程总结(全表扫描原数据表的情况):

  1. 全表扫描
    • MySQL 扫描原始数据表,逐行检查 b 列是否满足 b = xx 的条件。
    • 将符合 b = xx 的记录提取出来。
  1. 放入临时表
    • 将符合条件的记录放入临时表中(如果数据量较大且无法在内存中处理时)。
  1. 根据 a 进行分组
    • 在临时表中对 a 列进行 GROUP BY 操作,按 a 分组。
  1. 返回结果
    • MySQL 将分组后的结果返回给用户。

相关文章:

  • pdf.js滚动翻页的例子
  • Dubbo入门案例
  • 本地搭建OnlyOffice在线文档编辑器结合内网穿透实现远程协作
  • 在线订餐革命:Spring Boot 点餐系统
  • 静电势能(electrostatic potential energy)和电势(electric potential)
  • 戴尔笔记本电脑——重装系统
  • 进阶SpringBoot之 Dubbo 及 Zookeeper 安装
  • vant van-pull-refresh + van-list实现list列表支持搜索和下拉刷新
  • centos7如何连接网络 centos7wifi连接
  • 决策树算法在机器学习中的应用
  • WebGL复杂几何体与模型加载
  • Entity Framework扩展高级查询功能
  • 炉石传说辅助攻略—VMOS云手机助攻:国服回归任务要点,哪个辅助更好?
  • Elasticsearch 中 Painless 脚本详解
  • Python3爬虫教程-HTTP基本原理
  • 网络传输文件的问题
  • canvas绘制圆角头像
  • Docker入门(二) - Dockerfile
  • java概述
  • jquery cookie
  • PAT A1092
  • PHP变量
  • ReactNative开发常用的三方模块
  • redis学习笔记(三):列表、集合、有序集合
  • Redux系列x:源码分析
  • tab.js分享及浏览器兼容性问题汇总
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 工作手记之html2canvas使用概述
  • 机器学习中为什么要做归一化normalization
  • 简单易用的leetcode开发测试工具(npm)
  • 警报:线上事故之CountDownLatch的威力
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 微信公众号开发小记——5.python微信红包
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • No resource identifier found for attribute,RxJava之zip操作符
  • 阿里云服务器如何修改远程端口?
  • 关于Android全面屏虚拟导航栏的适配总结
  • 我们雇佣了一只大猴子...
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $nextTick的使用场景介绍
  • (09)Hive——CTE 公共表达式
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)逆序输出字符串
  • (void) (_x == _y)的作用
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (十六)一篇文章学会Java的常用API
  • (一)SpringBoot3---尚硅谷总结
  • *上位机的定义
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET MVC之AOP
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET企业级应用架构设计系列之结尾篇
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [000-01-008].第05节:OpenFeign特性-重试机制