sql执行流程经典案例分析

ops/2024/9/22 16:57:28/

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

sql">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.ppmy.cn/ops/114333.html

相关文章

1.随机事件与概率

第一章 随机时间与概率 1. 随机事件及其运算 1.1 随机现象 ​ 确定性现象:只有一个结果的现象 ​ 确定性现象:结果不止一个,且哪一个结果出现,人们事先并不知道 1.2 样本空间 ​ 样本空间:随机现象的一切可能基本…

【YOLO目标检测学生课堂行为数据集】共4266张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式:YOLO格式 图片数量:4266 标注数量(txt文件个数):4266 标注类别数:3 标注类别名称:hand、read、write 数据集下载:学生课堂行为数据集 图片示例 数据集图片&#…

区块链DAPP质押系统开发

质押系统开发DAPP(去中心化应用)是一个涉及多个步骤和技术领域的复杂过程。以下是质押系统开发DAPP的主要步骤和关键点: 一、需求分析 明确需求:与客户深入沟通,明确项目的具体需求,包括功能特性、用户体验…

解释器模式:将语法规则与执行逻辑解耦

解释器模式(Interpreter Pattern)是一种行为设计模式,它提供了评估语言的语法或表达式的方式。该模式通过定义一个语言的文法表示,并通过解释这些表示来执行相应的操作。 解释器模式主要用于设计一种特定类型的计算机语言或表达式…

GitLab 迁移后 Token 失效解决方法

在 GitLab 迁移过程中,如果未正确迁移或替换 gitlab-secrets.json 文件,会导致一些与加密相关的数据和功能失效,例如: CI/CD Runner Token 失效:CI/CD 相关的 runner token 无法匹配,导致构建失败或需要重…

Spring AI Alibaba,阿里的AI Java 开发框架

源码地址 https://github.com/alibaba/spring-ai-alibaba

java项目之在线考试与学习交流网页平台源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线考试与学习交流网页平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于JAVA语言…

【深入学习Redis丨第六篇】Redis哨兵模式与操作详解

〇、前言 哨兵是一个分布式系统,你可以在一个架构中运行多个哨兵进程,这些进程使用流言协议来接收关于Master主服务器是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。 文章目录 〇、…