一文搞懂MySQL执行流程

MySQL的技术架构包括Server层和存储引擎层,连接器负责验证用户权限,查询缓存处理SQL查询,解析SQL涉及词法和语法分析。执行SQL分为预处理、优化和执行阶段,其中优化器选择最佳执行计划,执行器与存储引擎交互完成数据检索。
摘要由CSDN通过智能技术生成

目录

一、MySQL技术架构

二、执行流程

1.连接器

2.查询缓存

3.解析SQL

4.执行SQL

总结


一、MySQL技术架构

 

可以看到,MySQL的技术架构共分为两层:Server层和存储引擎层

Server 层负责建立连接、分析和执行 SQL

存储引擎层负责数据的存储和提取

二、执行流程

1.连接器

在 Linux 操作系统里要使用 MySQL,第一步肯定是要先连接 MySQL 服务。

  • 与客户端进行TCP三次握手建立连接;
  • 检验客户端的账号和密码,如果用户名或密码不对,则会报错;
  • 如果用户名和密码都正确,则会读取该用户的权限,将该权限存放在连接器中,后续的权限逻辑判断都基于此时读取到的权限。

2.查询缓存

建立连接后,就可以对收到的SQL语句进行解析,判断语句属于什么类型。

2.1 如果是select语句,MySQL就会先去查询缓存里查找缓存数据,如果缓存数据存在,那么就会直接返回查询结果给客户端,否则就要往下执行,等执行完后,将查询的结果存入查询缓存中。查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。

2.2对于非查询语句,MySQL 5.7版本不会再走查询缓存的机制,每次执行都会直接操作数据库,而不会尝试从缓存中获取结果。

3.解析SQL

3.1词法分析。MySQL 会根据你输入的字符串识别出关键字出来,构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。

3.2语法分析。根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。

4.执行SQL

每条SELECT 查询语句的执行流程主要可以分为下面这三个阶段:

  • prepare 阶段,也就是预处理阶段;
  • optimize 阶段,也就是优化阶段;
  • execute 阶段,也就是执行阶段;

预处理器:①检查SQL查询语句中的表或者字段是否存在;②将select * 中的 * 扩展为表中的各个列;

优化器(主要负责将 SQL 查询语句的执行方案确定下来,不同执行计划的执行效率不同):使用explain命令查看SQL语句的执行计划,执行计划中的key就表示执行过程中使用了哪个索引

执行器(真正开始执行SQL语句):以主键索引查询为例

select * from product where id = 1;

这条查询语句的查询条件用到了主键索引,而且是等值查询,同时主键 id 是唯一,不会有 id 相同的记录,所以优化器决定选用访问类型为 const 进行查询,也就是使用主键索引查询一条记录,那么执行器与存储引擎的执行流程是这样的:

  • 执行器第一次查询,会调用 read_first_record 函数指针指向的函数,因为优化器选择的访问类型为 const,这个函数指针被指向为 InnoDB 引擎索引查询的接口,把条件 id = 1 交给存储引擎,让存储引擎定位符合条件的第一条记录。

  • 存储引擎通过主键索引的 B+ 树结构定位到 id = 1的第一条记录,如果记录是不存在的,就会向执行器上报记录找不到的错误,然后查询结束。如果记录是存在的,就会将记录返回给执行器;
  • 执行器从存储引擎读到记录后,接着判断记录是否符合查询条件,如果符合则发送给客户端,如果不符合则跳过该记录。
  • 执行器查询的过程是一个 while 循环,所以还会再查一次,但是这次因为不是第一次查询了,所以会调用 read_record 函数指针指向的函数,因为优化器选择的访问类型为 const,这个函数指针被指向为一个永远返回 - 1 的函数,所以当调用该函数的时候,执行器就退出循环,也就是结束查询了。

总结

执行一条 SQL 查询语句,期间发生了什么?

  • 连接器:建立连接,管理连接、校验用户身份;
  • 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
  • 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;
  • 执行 SQL:执行 SQL 共有三个阶段:
    • 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。
    • 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
    • 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值