sql的执行流程

执行过程分成两层,一层是server层,主要进行连接服务,和分析语句,执行sql

具体流程是 首先与用户通过连接器建立连接,然后将sql查询语句在查询缓存中查找,如果查找处理过相同的语句将,直接返回数据,给连接器,进而返回给用户,如果没有查到,则将sql语句发送给解析器,解析器中有词法分析和语法分析,通过这两个分析过程,创建对应的sql语法树,然后执行sql查询语句流程,首先经过预处理,优化器,执行计划,最后通过执行器,建立和存储引擎的连接

第二层是存储引擎层,当通过执行器将处理好的sql语句传到innodb引擎后,进行引擎内部的处理,最后返回查询结果,给执行器你,执行器将返回的记录发送给连接器。

具体分析每一个步骤都做了什么

连接器

首先执行 mysql -h -u -p 连接服务,连接过程需要经过TCP三次握手,因为Mysql是基于TCP协议进行传输的,建立完TCP连接后要开始验证用户名和密码,一个mysql服务可以被多个客户端连接,但是不是每个客户端都是一直请求服务的,但是如果长时间保持这个客户端的连接,会占用资源,mysql设置了最长的空闲链接保持时间,就是八小时,也可以手动关闭空闲连接使用 kill connection + id 的方式,mysql的连接数量也有限制,默认为最大连接数量是151 ,mysql的连接和http一样都有长短连接之分,长链接的好处是可以减少建立连接和断开连接的过程,所以一般使用的是长链接,但是mysql在执行查询过程中临时使用内存管理连接对象,这些连接对象只有在断开连接才会释放,如果存在的长链接很多,则会导致mysql占据大量内存空间,解决这个问题,可以从两个方面入手,一定期断开长链接,二客户端主动重置连接

查询缓存

就是将之前执行的select语句查询的结果使用键值对的方式保存下来,键是sql语句,值是结果,但是这个缓存结果,会因为如果这个表中的数据更改了,就就会出发缓存清空

MySQL 8.0 版本直接将查询缓存删掉了,也就是说 MySQL 8.0 开始,执行一条 SQL 查询语句,不会再走到查询缓存这个阶段了。

对于 MySQL 8.0 之前的版本,如果想关闭查询缓存,我们可以通过将参数 query_cache_type 设置成 DEMAND。

解析SQL

在正式执行 SQL 查询语句之前, MySQL 会先对 SQL 语句做解析,这个工作交由「解析器」来完成。

解析器

由两部分组成

词法分析器:

mysql会根据输入的字符串识别出关键字出来,例如sql语句 select username from userinfo ,在分析之后,会得到四个token,其中两个keyword,分别是select ,from

语法分析:

语法分析。根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法,如果没问题就会构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等

执行SQL

执行sql主要分成 ,预处理阶段,优化阶段,执行阶段

预处理器

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

2.将select * 中的*符号,扩展为表上的所有列;

优化器

经过预处理阶段后,还需要为sql查询语句先指定一个执行计划,优化器就是用来完成这个的。

优化器主要负责将sql查询语句的执行方案确定下来,比如表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定使用那个索引。

执行器

经历完优化器后,就确定了 执行方案,接下来mysql就真正开始执行语句了,这个工作是有执行器完成。在执行的过程中,执行器就会和存储引擎交互,交互是以记录为单位的。

总得来说一条查询语句的执行过程可以这样讲:首先连接器和客户端建立连接,连接的建立就是使用的tcp建立连接,三次握手,然后使用的是长链接的方式建立连接,为了避免长链接带来的长期占用内存资源问题,使用定期断开连接的方式和客户端主动重置连接的方式,空闲连接最多保持8个小时,最多可以连接151个。然后如果是select语句则还会经过查缓存的方式,查看缓存中是否有保存的数据,查缓存在mysql8.0后取出了,因为没啥用。然后就是执行分析器,分析器首先进行词法分析,就是找出语句中使用的关键字,然后进行语法分析,就是利用词法分析的结果构建语法树,方便后面进行模块化处理。然后就进入了执行sql过程,执行sql过程分为三个部分,预处理部分,就是将select中的*号变成列中的所有表名和检查sql查询语句中的表明是否都存在,接着进入优化器阶段,优化器会根据语句中的情况,选择代价最小的方式执行语句,比如选择合适的键进行索引查询,最后到了执行阶段,根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端

相关推荐
Decay__4 小时前
22_MySQL 运维自动化平台 —— 部署编排 + 监控 + 巡检 + 告警 + 工单闭环一体化
运维·数据库·sql·mysql·架构
Decay__6 小时前
21_MySQL 优化案例集 —— 慢 SQL 优化、索引重构与参数调整收益对比
运维·数据库·sql·mysql·架构
挖掘狂人7 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
后端·sql·mysql
codigger7 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
数据库·sql·mysql·程序员
Francek Chen7 小时前
【大数据处理与分析】数据仓库Hive:09 Hive 编程实践
大数据·数据仓库·hive·hadoop·sql
麦壳饼7 小时前
SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写
数据库·人工智能·sql·sonnetdb
Decay__16 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
凤凰院凶涛QAQ18 小时前
《MySQL内核拆解:从SQL到InnoDB》(四) : 联合查询 & 视图
数据库·sql·mysql
Decay__1 天前
19_MySQL 告警与自动化运维 —— 告警分级收敛 / Webhook / 定时巡检 / 脚本库
运维·数据库·sql·mysql·架构
herinspace2 天前
管家婆实用贴-SQL 2008如何修改成混合模式
服务器·数据库·sql·管家婆软件·财务软件·合肥管家婆软件