介绍
本篇博文是自己学习儒猿技术窝)中:《从零开始带你成为MySQL实战优化高手》专栏课程,进行的总结,因为老师写的很好,所以很大一部分直接拿过来使用。
如果想学习完整的知识,请支持正版,地址:从零开始带你称为MySQL实战优化高手(儒猿技术窝)
本文主要讲解了一次数据更新在mysql中经历了哪些过程。
先直接看下我们会讲到哪些步骤,文章中 主要有以下9个步骤:
- (1)更新语句经过 解析,优化 生成执行计划,交由执行器调用存储引擎接口(注:执行器会多次调用存储引擎接口,并不是一次完成)
- (2)查询旧值,先去内存缓冲区查看是否有数据,如果没有,从磁盘中加载到内存,并将旧值写入到 Undo log 日志中,用于回滚数据
- (3)更新内存中的数据(注:磁盘仍为旧数据)
- (4)将操作写入到Redo Log 中
- (5)Redo Log根据刷盘策略刷到磁盘
- (6)准备提交事务,写入binlog 日志(注:binlog也有自己的刷盘策略)
- (7)把本次更新对应的binlog文件名称和这次 更新的binlog日志在文件里的位置,都写入到redo log日志文件里去,同时在redo log日志文件里写入一个commit标 记。
- (8)事务完成
- (9)mysql会有个后台线程将内存数据刷入到磁盘
整体的流程图如下:
更新语句
首先假设我们有一条SQL语句是这样的:
update users set name='xxx' where id=10
那么我们先想一下这条SQL语句是如何执行的?
首先肯定是我们的系统通过一个数据库连接发送到了MySQL上,然后肯定会经过SQL接口、解析器、优化器、执行器 几个环节,解析SQL生成解析树,优化,选取根据Mysql认为最优的执行计划(注:Mysql有着自己的评分算法,在精准度和性能上进行了平衡,因此选取的有可能不是真正的最优的执行计划,但是问题不大,一般来说,都是比较不错的,不要轻易尝试让SQL按自己的想法执行),接着去由执行器负责这个计划的执行,调用InnoDB存储引擎的接口去执 行。