MYSQL--一条SQL执行的流程,分析MYSQL的架构

embedded/2025/2/6 13:24:17/

文章目录

      • 第一步建立连接
      • 第二部解析 SQL
      • 第三步执行 sql
        • 预处理
        • 优化阶段
        • 执行阶段
        • 索引下推

执行一条select 语句中间会发生什么? 这个是对 sql>mysql 架构的深入理解。

sql">select * from product where id = 1;

对于sql>mysql架构分层:

sql>mysql 架构分成了 Server 层和存储引擎层:

Sever 层 负责建立连接、分析和执行 sql 语句。 一些核心功能模块比如解析器生成语法树,预处理器、优化器、执行器这些。

在存储引擎层:支持 InnoDB 存储引擎。底层使用的是 B+树。sql>mysql5.5 之后 InnoDb 成为默认的存储引擎了。

第一步建立连接

通过连接器和 sql>mysql 的客户端建立连接,连接的过程需要使用 TCP 三次握手。

msyql -u root -p在输入对应的密码就登录成功了

查看 sql>mysql 当前有多少连接数量:

show processlist;

执行了一次查询就算建立连接了,连接默认是八个小时,超过这个数量就会自动的断开。

连接数太多了

删除了查询缓存,在 sql>mysql8 之前有缓存的内容。

第二部解析 SQL

解析器会做两件事情,第一个是词法分析:

sql>mysql 会根据你输入的字符串识别出关键字出来,比如 select username from userinfo 会解析出来 4 个 token,有两个 key word,是 select 和 from。

第二个进行语法的分析:

根据词法分析的结果,语法解析器根据语法规则判断输入的 sql 是否满足 MYSQL 的语法。没有问题就构建出来 sql 语法树。

构成一个这样的语法树。

https://blog.csdn.net/zhang24360/article/details/128963299 语法树的详细内容

sql_75">第三步执行 sql

分为三个阶段 预处理 优化阶段 执行阶段

预处理

预处理阶段:

检查 sql 查询语句中的表或者字段是否存在。

将 select * 中的*符号扩展为表上的所有列。

优化阶段

优化阶段:

需要确定一个执行计划,比如现在有多个索引到底用哪一个索引。确定 sql 查询语句的执行方案。

想要知道选择哪个索引可以在查询语句之前加一个 explain 命令,会展示书 sql 语句的查询计划。

查询主键索引 B+树的成本会高于查询二级索引 B+树的成本,优化器会基于查询成本考虑选择代价最小的普通索引。

执行阶段

执行阶段:

这个时候 server 层要去和存储引擎层进行交互了:

比如有 全表扫描、主键索引查询、索引下推。

索引下推

索引下推是减少二级索引的回表查询操作,提高查询的效率。将 Server 层做的一些事情交给了存储引擎层去做。

查询 age>20 的时候遇到>联合索引就会失效了,这个时候就需要回表查询 reward 是否是等于 1000 的。

这样效率太慢了,直接在存储引擎层去判断 reward 是否等于 1000. 如果成立在回表给 Server 层操作。


http://www.ppmy.cn/embedded/160038.html

相关文章

深度学习-第五章机器学习基础

前言 5.1 学习算法 5.1.1 任务 5.1.2 性能度量 5.1.3 经验 5.1.4 示例: 线性回归 5.2 容量、过拟合和欠拟合 5.2.1 没有免费午餐定理5.2.2 正则化 5.3 超参数和验证集 5.3.1 验证集的作用5.3.2 交叉验证 5.4 估计、偏差和方差 5.4.1 点估计5.4.2 偏差5.4.4 权衡偏差和方差以…

【Leetcode 每日一题 - 补卡】680. 验证回文串 II

问题背景 给你一个字符串 s s s,最多 可以从中删除一个字符。 请你判断 s s s 是否能成为回文字符串:如果能,返回 t r u e true true;否则,返回 f a l s e false false。 数据约束 1 ≤ s . l e n g t h ≤ 1 0 …

【Unity3D】实现横版2D游戏——攀爬绳索(简易版)

目录 GeneRope.cs 场景绳索生成类 HeroColliderController.cs 控制角色与单向平台是否忽略碰撞 HeroClampController.cs 控制角色攀爬 OnTriggerEnter2D方法 OnTriggerStay2D方法 OnTriggerExit2D方法 Update方法 开始攀爬 结束攀爬 Sensor_HeroKnight.cs 角色触发器…

Go学习:Go语言中if、switch、for语句与其他编程语言中相应语句的格式区别

Go语言中的流程控制语句逻辑结构与其他编程语言类似,格式有些不同。Go语言的流程控制中,包括if、switch、for、range、goto等语句,没有while循环。 目录 1. if 语句 2. switch语句 3. for语句 4. range语句 5. goto语句(不常用…

如何用hooks实现redux?

使用 Hooks 实现 Redux 的功能可以通过 useReducer 和 useContext 来实现。下面是一个简单的示例,演示如何用 Hooks 创建一个基本的 Redux-like 状态管理。 1. 创建 Redux Store 首先,创建一个 reducer 函数来管理状态变化。 // reducer.js const initialState = {count: 0…

GAMES101学习笔记(五):Texture 纹理(纹理映射、重心坐标、纹理贴图)

文章目录 纹理映射 Texture Mapping插值 Interpolation重心坐标 Barycentric Coordinates应用纹理 Applying Textures纹理太小的问题 - 插值纹理过大的问题 - 多级渐远纹理Mipmap各种纹理贴图环境光贴图 Environment Map凹凸贴图 Bump Mapping位移贴图 Displacement mapping程序…

MySQL的GROUP BY与COUNT()函数的使用问题

在MySQL中,GROUP BY和 COUNT()函数是数据聚合查询中非常重要的工具。正确使用它们可以有效地统计和分析数据。然而,不当的使用可能会导致查询结果不准确或性能低下。本文将详细讨论 GROUP BY和 COUNT()函数的使用方法及常见问题,并提供相应的…

2024第一届Solar杯应急响应挑战赛 内存取证

提供vol和magnet两种做法 基本上都能解决 内存取证1: 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1} rdp连接既远程连接 而windows远程连接默认端口为3389端口 python2 vol.py -f ../SERVER-2008-20241220-162057.raw --profileWin7SP1x64 netscan | grep 33…