用一次数据更新流程,初步了解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后才进入磁盘,此时如果宕机,数据就会丢失。