Mysql架构分析

一条查询SQL的执行逻辑是什么?

当你在客户端中编写了一条SQL语句执行

  1. 首先客户端需要与Mysql建立连接
  2. 查询缓存。不过缓存是默认关闭的,因为缓存限制太多,只有完全相同的SQL才会命中缓存。且当缓存中数据数据发生改变时,这张表的所有缓存都会失效。Mysql8.0中,查询缓存已被移除。
  3. 语法解析,根据Mysql定义的语法规则,根据一条SQL语句生成Mysql能够解析的数据结构,这种数据结构叫做解析树。
  4. 预处理器,检查表名、字段是否正常,是否有歧义。处理后得到新的解析树
  5. 查询优化器,根据解析树生成不同的执行计划,然后选择最优的执行计划。优化器的作用:使用关联查询时,使用那张表作为基表,有多个索引时,使用哪个索引
  6. 执行引擎操作相应的API去查询存储引擎

Mysql架构分层

基于上面的执行逻辑,将Mysql架构分为三层:连接层、服务层、存储层
连接层:管理连接、权限校验
服务层:缓存、语法解析器、预处理器、优化器、执行器
存储层:存储数据,提供读写接口

一条更新sql是如何执行的?

对于InnoDB来说,所有数据都是存储在磁盘上的,想要操作数据,必须把数据先加载到内存中才可以进行操作,而IO操作相对于内存来说速度是很慢的,如果数据分散在磁盘多处,那么要进行多次IO操作吗?答案是否定的。Mysql存储引擎有一个预读的概念,当存储引擎读取一块儿内存的时候,它附近的内存有可能也很快被读取到,那么就干脆一次性多读取一点。而不是用多少取多少
InnoDB从磁盘读取数据到内存的最小单位叫做页,默认16KB大小。
读取到数据数据后,将数据写入到Buffer pool中,在读取数据时,先判断数据是否在Buffer pool中,如果存在直接读取,否则从硬盘读取,加载到缓冲区。
在修改数据的时候,也是先写入到Buffer pool,而不是直接写入到硬盘。在内存页和磁盘数据不一致的时候,我们把它叫做脏页。InnoDB有专门的线程把buffer pool中的数据同步到磁盘,这种行为叫做刷脏。buffer pool的作用是提高读写效率

Redo log(重做日志)作用

在脏页还未同步到磁盘时,如果服务器发生故障,那么数据就会丢失。所以数据必须有一个持久化措施。InnoDB把所有对页的修改操作专门写入了一个日志文件,如果数据未同步磁盘,在数据库重启后会从这个日志文件中进行恢复。数据库的持久性就是用这个日志来实现的

redo log不是记录数据更新后的状态,而是记录了在某个数据页上做了什么修改。redo log大小是固定的,如果写满了,就会触发刷脏

Undo log(撤销日志)作用

undo log记录了事务发生前的数据状态,分为insert undo log、update undo log。如果修改时出现异常,就是用undo log来恢复数据

简述更新过程

修改user表李三的name改成李四

  1. 从buffer pool或磁盘中读取数据,拿到数据页返回给执行期
  2. 执行器修改数据页这一行的数据值为李四
  3. 记录name=李三到undo log
  4. 记录name=李四到redo log
  5. 数据同步到磁盘

buffer pool满了怎么办

InnoDB使用LRU算法来管理缓冲池。传统LRU使用Map+链表来实现

双写缓冲

InnoDB存储引擎的页为16K,而操作系统一个页为4K,所以同步一次数据需要分四次同步,那么如果在同步数据期间发生了问题,就可能导致数据丢失。那么是不是可以使用redo log来恢复数据呢,如果页本身已经损坏,根据redo log恢复是没有意思的。所以在应用redo log之前,需要一个页的副本,如果出现写入失效,就用页的副本来恢复页,然后再应用redo log,这个页的副本,就是双写缓冲,通过InnoDB双写技术,实现页的可靠性

Mysql架构分析_第1张图片

如上图所示,Double Write由两部分组成:

  • 一部分是内存中的double write buffer,大小为2MB;
  • 另一部分是物理磁盘上共享表空间连续的128个页,大小也为2MB。

在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是将脏页先复制到内存中的double write buffer区域。

Mysql架构分析_第2张图片

之后通过double write buffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后马上同步磁盘,避免操作系统缓冲写带来的问题。

Mysql架构分析_第3张图片

在完成double write页的写入后,再将double wirite buffer中的页写入各个表的独立表空间文件中。

Mysql架构分析_第4张图片

如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,InnoDB存储引擎可以从共享表空间中的double
write中找到该页的一个副本,将其复制到表空间文件中,再应用重做日志。

Bin log

bin log记录了所有操作,属于逻辑日志,可以用来做主从复制和数据恢复
和redo log不同的是,bin log日志是可以追加的,没有固定的大小限制
开启了bin log功能后,我们可以把bin log导出成sql语句,把所有操作重放一遍,来实现数据恢复

sql更新流程

Mysql架构分析_第5张图片

Mysql架构分析_第6张图片

你可能感兴趣的:(Mysql)