涵盖 MySQL 的大多数核心服务功能

InnoDB存储引擎与SQL执行揭秘:从连接器到CRASH-SAFE
本文深入剖析MySQL Server层的执行流程,重点讲解InnoDB存储引擎如何通过REDOLOG实现CRASH-SAFE,以及SQL更新操作的详细步骤,包括连接、缓存、解析、优化和执行过程。

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

2.2 更新 SQL 的执行

当我们执行一条更新 SQL 时是如何执行的呢,下面执行一条简单的 SQL 更新语句 (默认存储引擎 InnoDB)


  1. update T set c=c+1 where ID=2;

第一步:连接器
先通过连接器连接到这个数据库上。连接器负责跟客户端建立连接、校验用户名密码的正确性,同时获取该用户的权限放到缓存中、维持和管理连接

第二步:缓存
连接建立完成后,如果执行的是 SELECT 查询 语句会查询缓存中是否存在该 SQL 的结果集,如果存在结果则再校验用户表和数据的权限最终将查询到的结果返回。如果是 UPDATE,DELETE 等更新操作,那么跟这个表有关的查询缓存会置为失效,所以这条语句就会把表 T 上所有缓存结果都清空。

第三步:分析器
如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL 需要知道你要做什么,因此需要对 SQL 语句做解析。
分析器先会做 “词法分析”。你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。例如该语句中 c 列在表 T 中是否存在等。
做完了这些识别以后,就要做 “语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。该 SQL 语句中的 update、where 等是否符合 SQL 语法

第四步:优化器
经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序;优化器决定要使用 ID 这个索引。指定索引也就指定了后面的执行器需要调用存储引擎的哪个接口进行执行。

第五步:执行器
MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误。执行器负责具体执行,找到这一行,然后更新。

2.3 InnoDB 存储引擎引入 REDOLOG

Mysql 本身有自己的日志记录 binlog (归档日志:分为 row,statement 两种模式),但是只依靠 binlog 是没有 crash-safe 能力的,所以在存储引擎层 InnoDB 使用另外一套日志系统 redolog 来实现 crash-safe 能力。同时为了取得更好的读写性能,InnoDB 会将数据缓存在内存中(InnoDB Buffer Pool),对磁盘数据的修改也会落后于内存,这时如果进程或机器崩溃,会导致内存数据丢失,从而保证数据库本身的一致性和持久性。修改 Page 之前需要先将修改的内容记录到 REDO 中,并保证 REDO LOG 早于对应的 Page 落盘,也就是常说的 WAL,Write Ahead Log。当故障发生导致内存数据丢失后,InnoDB 会在重启时,通过重放 REDO,将 Page 恢复到崩溃前的状态。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值