- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
图文03用一次数据更新流程,初步了解InnoDB存储引擎的架构设计手机观看
2177人次阅读2020-01-1507:00:00
详情评论
用一次数据更新流程,初步了解InnoDB存储引擎的架构设计
如何提问:每篇文章都有评论区,大家可以尽情留言提问,我会逐一答疑
如何加群:购买狸猫技术窝专栏的小伙伴都可以加入狸猫技术交流群,一个非常纯粹的技术交流的地方
具体加群方式,请参见目录菜单下的文档:《MySQL专栏付费用户如何加群》(购买后可见)
1、更新语句在MySQL中是如何执行的?
之前我们已经分析了MySQL架构上的整体设计原理,现在对一条SQL语句从我们的系统层面发送到MySQL中,然后一
步一步执行这条SQL的流程,都有了一个整体的了解。
我们已经知道了,MySQL最常用的就是InnoDB存储引擎,那么我们今天借助一条更新语句的执行,来初步的了解一
下InnoDB存储引擎的架构设计。
首先假设我们有一条SQL语句是这样的:
updateuserssetname=xxxwhereid=10
那么我们先想一下这条SQL语句是如何执行的?
首先肯定是我们的系统通过一个数据库连接发送到了MySQL上,然后肯定会经过SQL接口、解析器、优化器、执行器
几个环节,解析SQL语句,生成执行计划,接着去由执行器负责这个计划的执行,调用InnoDB存储引擎的接口去执
行。
所以先看下图,大致还是会走下图的这个流程
今天我们就来探索一下这个存储引擎里的架构设计,以及如何基于存储引擎完成一条更新语句的执行
2、InnoDB的重要内存结构:缓冲池
InnoDB存储引擎中有一个非常重要的放在内存里的组件,就是缓冲池(BufferPool),这里面会缓存很多的数据,
以便于以后在查询的时候,万一你要是内存缓冲池里有数据,就可以不用去查磁盘了,我们看下图。
所以当我们的InnoDB存储
引擎要执行更新语句的时候,比如对“id=10”这一行数据,他其实会先将“id=10”这一行数据看看是否在缓冲池里,如果不在的
话,那么会直接从磁盘里加载到缓冲池里来,而且接着还会对这行记录加独占锁。
因为我们想一下,在我们更新“id=10”这一行数据的时候,肯定是不允许别人同时更新的,所以必须要对这行记录加
独占锁
至于锁的详细分析,我们后续也会有,大家不用着急,在这里先初步了解即可,我们看下面的图
3、undo日志文件:如何让你更新的数据可以回滚?
接着下一步,假设“id=10”这行数据的name原来是“zhangsan”,现在我们要更新为“xxx”,那么此时我们得先
把要更新的原来的值“zhangsan”和“id=10”这些信息,写入到undo日志文件中去。
其实稍微对数据库有一点了解的同学都应该知道,如果我们执行一个更新语句,要是他是在一个事务里的话,那么事
务提交之前我们都是可以对数据进行回滚的,也就是把你更新为“xxx”的值回滚到之前的“zhangsan”去。
所以为了考虑到未来可能要回滚数据的需要,这里会把你更新前的值写入undo日志文件,我们看下图。
4、更新bufferpool中的缓存数据
当我们把要更新的那行记录从磁盘文件加载到缓冲池,同时对他加锁之后,而且还把更新前的旧值写入undo日志文件
之后,我们就可以正式开始更新这行记录了,更新的时候,先是会更新缓冲池中的记录,此时这个数据就是脏数据
了。
这里所谓的更新内存缓冲池里的数据,意思就是把内存里的“id=10”这行数据的name字段修改为“xxx”
那么为什么说此时这行数据就是脏数据了呢?
因为这个时候磁盘上“id=10”这行数据的name字段还是“zhangsan”,但是内存里这行数据已经被修改了,所以
就会叫他是脏数据。
我们看下图,我同时把几个步骤的序号标记出来了。
您可能关注的文档
- 从0开始带你成为MySQL实战高手04 借着更新语句在InnoDB存储引擎中的执行流程,聊聊binlog是什么.pdf
- 从0开始带你成为MySQL实战高手06 生产经验:互联网公司的生产环境数据库是如何进行性能测试的.pdf
- 从0开始带你成为MySQL实战高手08 生产经验:在数据库的压测过程中,如何360度无死角观察机器性能.pdf
- 《科研团队》课件.ppt
- 《积分原理与应用》课件.ppt
- 《积分与路径无关》课件 .ppt
- 《积分及其应用》课件.ppt
- 《秋季养生》课件.ppt
- 《离散数学要点》课件.ppt
- 湖南省长沙市第一中学2024-2025学年高三上学期适应性演练英语试题 Word版含解析.docx
文档评论(0)