sql执行流程经典案例分析

现在有联合索引(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 将分组后的结果返回给用户。
相关推荐
wno7042 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数4 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室4 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen5 小时前
mysql数据库基本操作
数据库·mysql
2603_965148115 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe5 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新6 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball7 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai8 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网8 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析