Mysql-更新语句的执行
1. 更新语句执行流程

1 | mysql> update T set c=c+1 where ID=2; |
- 客户端通过连接器连接 MySQL 服务器
- 将缓存中相关表的结果清空
- 分析器通过词法和语法分析判断是更新语句
- 优化器通过索引,决定使用 ID 的索引
- 执行器执行更新语句
- 进行 redo log 和 bin log 的修改
2.Redo log(引擎日志)
情景老板记账:先把借帐和还账记录写在黑板上,空闲时,再把黑板上账的写入到账本中。
作用: 用作数据库写入将数据磁盘的缓存,防止每次更新都要将数据写进磁盘,提高了更新效率。

1. WAL (Write-Ahead Logging)
**先写日志,再写磁盘**。
InnoDB 引擎会把记录写道 redo log 中,并更新内存。然后更新就算完成。引擎会在空闲时间操作记录
写入磁盘。
如果 redo log 写满了,会把一部分记录更新到磁盘中。
通过 write pos 和 check point 两个指针来判断日志是否写满
2. crash-safe
当数据库发生异常时,可以通过 redo log 可以获取到之前的提交记录。
通过提交记录可以将未同步到数据库中数据同步到数据库中。
redo log 存储的是物理变更日志,用于记录磁盘中指定地方的数值修改记录。
3. 特点
- 存储的物理日志(记录的是数据页上数据的更改)
- 先写日志,后写磁盘
- 可以 crash safe 进行数据的修复
- InnoDB 引擎层日志
- 空间有限会用完,通过队列的实现循环写
3. binlog(Server 层日志)
1. 特点
- 服务层日志
- 存储的内容是逻辑日志(记录的是语句的原始逻辑)
- 空间无限,通过新增文件实现追加写
4. 执行流程
- 执行引擎先找到 ID=2 的这一行数据,如果内存中存在直接返回给执行器,否则从磁盘读入内存然后返回给执行器
- 把值加上 1,然后调用引擎接口写入数据
- 引擎会将新数据更新到内存中,同时更新到 redo log 中。redo log 处于 prepare 状态,告诉执行器完成了,可以提交事务了。
- 执行器生成更新操作的 bin log,并把 bin log 写入磁盘
- 执行器调用引擎的事务接口,将写入的 redo log 改成 commit 状态

5. 两阶段提交

原因
- 如果发生 crash 导致系统崩溃的话,如果顺序不一致,可能导致之后无法通过 binlog 恢复到任一时刻的数据
- 可能导致 binlog 和 redo log 的数据不一致导致数据冲突。
6. 两种日志的不同点
- redo log 是 InnoDB 引擎特有的,binlog 是 MySQL 的 Server 层实现的
- redo log 是物理日志,记录的是 在某个数据页上做了修改,binlog 是逻辑日志记录的是语句逻辑 给 ID=2 的数据进行加 1
- redo log 是循环写,空间大小固定。bin log 是追加写,当 bin log 文件到达一定大小后会切换到下一个,不会覆盖以前的日志
7. 小结
- 更新语句的执行流程
- Redo log 的作用是用来存储 MySQL 产生更新语句的物理日志。通过 WAL 技术先将日志写入 队列中然偶后通过指定条件写入磁盘中
- bin log 的作用和特点
- 两种日志的不同点
- 两阶段提交的作用
- 保证数据库的数据不冲突
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无♥部落阁!
评论





