网站大量收购独家精品文档,联系QQ:2885784924

从0开始带你成为MySQL实战高手03 用一次数据更新流程,初步了解InnoDB存储引擎的架构设计.pdfVIP

从0开始带你成为MySQL实战高手03 用一次数据更新流程,初步了解InnoDB存储引擎的架构设计.pdf

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

奎奎 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档