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

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 将分组后的结果返回给用户。

http://www.kler.cn/news/314293.html

相关文章:

  • 从Profinet到Ethernet IP网关技术重塑工业网络,数据传输更流畅
  • Go语言并发编程中的超时与取消机制解析
  • 基于菜鸟教程的flask学习记录 —— Flask视图函数
  • Java.猜数字小游戏
  • Go 语言字典探秘:操作指南与约束解析
  • Git之如何删除Untracked文件(六十八)
  • MySQL的索引——提高查找算法的数据结构 B+树
  • Qt容器类控件——QGroupBox和QTabWidget
  • 计算机网络(月考一知识点)
  • Windows安装Oracle11gR2(图文教程)
  • Docker部署ddns-go教程(包含完整的配置过程)
  • 基于 K8S kubernetes 搭建 安装 EFK日志收集平台
  • 深度学习实战93-基于BiLSTM-CRF模型的网络安全知识图谱实体识别应用
  • CTC loss 博客转载
  • C++(2)进阶语法
  • 职业技能大赛-自动化测试笔记分享-2
  • 长亭WAF绕过测试
  • Spring AI Alibaba,阿里的AI Java 开发框架
  • 【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
  • C语言CRC16_CCITT_FALSE函数法和查表法实现
  • ArcGIS10.2/10.6安装包下载与安装(附详细安装步骤)
  • Unity坐标系求向量的模长
  • 【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??
  • 常用卫星学习
  • sql语句在mysql中的执行过程
  • 大数据-143 - ClickHouse 集群 SQL 超详细实践记录!
  • 运维工程师面试整理-团队协作
  • 大数据最新面试题(持续更新)
  • 入门sentinel
  • 焦化行业的变革力量:智能巡检机器人