用一次数据更新流程,初步了解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后才进入磁盘,此时如果宕机,数据就会丢失。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)