langjitianyaluotongxue

导航

用一次数据更新流程,初步了解InnoDB存储引擎的架构设计

1.更新语句在mysql中是怎么执行的

 mysql最常用的就是InnoDB存储引擎,一个系统通过一个数据库发送到mysql上,然后肯定会经过SQL接口,解析器,优化器,执行器几个环节,解析sql语句,生成执行计划,接着由执行器负责这个计划的执行,调用innoDB引擎的接口去执行。

 

 

 2.innoDB重要的内存结构:缓冲池(buffer pool)

这是innoDB很重要的一个组件,查询数据的时候如果里面有数据就不用去磁盘查询了,比如引擎要更新语句的时候,比如id=10 这个数据,先去缓冲池里查有没有这个数据,没有的话就去磁盘查询,查询到后再放入缓冲池,更新这行数据的时候是不允许别人更新的,会对这个记录加独占锁

3.undo日志文件:如何让你更新的数据回滚?

比如我们要更新id=10的这条数据name,由zhangsan更新为xxx,我们需要先把更新之前的值保存在undo 日志文件里,我们知道在事务提交之前是可以回滚数据的,这个undo日志文件就是方便回滚

4.更新缓存池里的数据

我们要更新id=10的这条数据,先从磁盘加载到缓存池,这时缓存池数据开始更新,磁盘还没有更新,这时就时脏数据

 

 

 5.如果事务还没提交,mysql系统宕机怎么办?

如果更新了这条数据name=xxx,缓存池里修改了,undo日志文件也存到了Redo Log Buffer (专门存undo 日志的一个组件),如果突然宕机,缓存池和这个Redo Log Buffer 数据都会丢失,不过丢失也不要紧,磁盘数据还是更新前的数据

6.提交事务的时候将redo日志写入磁盘中

事务提交后,有一个策略就会把redo日志从redo log Buffer 缓存区刷到磁盘文件里去

这个策略是通过innodb_flush_log_at_trx_commit来配置的,他有几个选项。

当这个值是0,不会把redo日志刷到磁盘,mysql宕机,数据丢失。

当这个值是1,提交事务的时候,必须把内存中的redo log 刷到磁盘里

当这个值是2,把redo日志写入磁盘文件对应的 os cache 缓存里去,而不是直接进入磁盘,可能1s后才进入磁盘,此时如果宕机,数据就会丢失。 

 

posted on 2022-09-13 11:43  浪迹天涯骆同学  阅读(65)  评论(0编辑  收藏  举报