范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

通过一条语句的执行,深入理解innoDB的底层架构

  MySQL最常用的存储引擎是innodb,我们今天就借助一条更新语句的执行,了解下innodb具体是如何处理的,深入理解下它的架构。
  假设更新语句是这样的:  update user set name ="xxx" where id = 1;
  这条SQL语句发送到MySQL上后,会经过SQL接口、解析器、优化器、执行器几个阶段,解析SQL、生成执行计划,再由执行器调用存储引擎执行这个执行计划。
  如下图所示:
  图1 MySQL底层架构
  下面我们就跟随一条update语句,分析下innodb存储引擎的架构设计。
  1、innodb最重要的组件:缓冲池(BufferPool)
  innodb存储引擎中有一个非常重要的组件,就是缓冲池(BufferPool),这里面会缓冲很多数据,以便于以后操作数据的时候,可以直接操作内存,就不用访问磁盘了。
  图2 innoDB重要组件缓冲池
  innoDB执行上面那条更新语句的时候,会先看id = 1的这条语句是否在缓冲池中,如果不再就需要从磁盘加载到缓冲池来,而且还会对这条记录加独占锁。
  锁相关的知识点,后面会有讲解,这里不是重点,就不展开了。
  2、undo日志文件
  接下来,准备更新id = 1的这条数据时,会先把id = 1和name原来的值写入到undo日志文件中去。
  这么做的目的是什么?当然是方便回滚了。
  MySQL增删改数据都是放在事务里执行的,如果事务提交失败了,就可以根据undo日志进行回滚。
  图3 undo日志文件
  把id = 1的那条要更新的数据加载到缓冲池,把要更新数据的旧值写入undo日志文件后,就可以开始更新这条记录了。
  更新的时候,先更新缓冲池的数据。更新完后,缓冲池里的数据就变成:name = "xxx"了,而此时磁盘上的数据还是name="zhangsan"。此时innoDB数据状态就变成这样了:
  图4 更新缓冲池数据
  3、redo日志文件
  此时缓冲池和磁盘上的数据是不一致的,如果MySQL宕机了,怎么办?
  此时MySQL宕机了,缓冲池里的数据肯定就丢失了。
  这时候,就要引入一个新的组件: redo日志。
  redo日志也是一个内存缓冲区,用来存放redo日志的,就是用来记录你对数据做了那些修改。
  比如,id = 1这条记录,修改了name,redo日志可能就这样:id = 1, name = "xxx"。
  图5 redo日志
  有了redo log,MySQL宕机后重启,就可以恢复更新后的数据。
  但是,如果此时MySQL数据库宕机了,会怎样?
  必然是缓冲池中修改过的数据,redo log buffer日志都会丢失。
  但是,这也不要紧,因为你更新数据的事务没有提交,此时MySQL宕机了,事务就执行失败了,客户端会收到一个数据库异常,MySQL重启后磁盘上的数据还是原样子。
  所以数据还是一致的。
  另外,redo日志是innoDB特有的一个组件。
  4、提交事务
  上面的步骤完成之后,就要提交事务了,此时会把redo日志刷到磁盘上去。
  刷盘策略可以通过innodb_flush_log_at_trx_commit来配置。
  这个配置有几个选项:
  0,提交事务的时候,不会把redo日志刷入磁盘;
  1,默认值,提交事务的时候,会把redo刷入磁盘,只要事务提交成功,redo日志就比如进入磁盘了。
  2,提交事务的时候,会把redo刷入os cache。操作系统会不定期把os cache里的数据刷到磁盘里去。
  所以innodb_flush_log_at_trx_commit等于0或2的时候,redo日志都有事务提交成功,没写进磁盘的可能,缓冲池里更新后的数据也丢失了。此时MySQL重启,就无法根据redo恢复更新后的数据,就会出现数据不一致情况。
  所以一般情况下,我们都会把innodb_flush_log_at_trx_commit配置为1。
  图6 redo日志
  5、binlog日志
  其实MySQL中提交事务的时候,还会记录binlog。binlog是MySQL server自己的日志文件。
  redo日志属于一种偏向于物理性质的重做日志,它里面记录的相当于是"对某某数据页的某某记录,做了某某修改"。
  binlog叫做归档日志,它里面记录的是偏向于逻辑性的日志,类似于redis的aof日志。
  我们提交事物的时候,除了把redo log日志写到磁盘,还会同时把对应的binlog日志写到磁盘文件中。
  图7 binlog日志
  与redo log日志一样,binlog日志有两种刷盘策略,相应的配置项为: sync_binlog。
  0,默认值,提交事务的时候,会把binlog刷入os cache。
  1,提交事务的时候,会把binlog写入磁盘。
  所以,当sync_binlog设置为0的时候,如果机器宕机,binlog会有丢失的风险。设置为1的时候,即使机器宕机,binlog日志也不会丢失。
  当我们把binlog日志写入磁盘后,接着就完成了最终的事务提交,最后会把本次更新对应的binlog日志文件名和这次更新的binlog日志在文件里的位置,都写入到redo log日志里去,同时在redo log日志文件里写入一个commit标记。
  到此为止,一个事务提交才是完成了。
  图8 binlog刷到磁盘
  最后再补充一点,在redo日志中写入commit标识,其目的是保持redo log日志与binlog日志一致的。
  也就是说,innoDB根据commit标识判定一个事务是否执行成功。如果在图8的5、6、7步,必须是三个步骤都执行成功了,才算提交了事务。假如执行其中某个步骤的时候,机器宕机了,会怎样?
  这时候,因为redo日志里没有commit标识,所以会判定此次事务执行不成功,就不会出现数据不一致的情况。
  6、后台线程把内存数据刷到磁盘
  此时事务提交了,已经把缓冲池(BufferPool)中的数据更新了,磁盘里也有了redo日志和binlog日志,但这时候,磁盘上的数据还是旧的啊。
  所以MySQL会有一个后台IO线程,会在某个时间,随机把缓冲池(BufferPool)中的数据刷到磁盘上去。
  图9 innoDB执行更新语句时的完整流程
  后台IO线程把缓冲池的数据刷到磁盘前,即使MySQL宕机,也没关系,因为机器重启后,会根据redo日志回复之前提交事务所作的修改。
  7、总结
  通过一次更新数据的流程,了解了innoDB存储引擎做了哪些工作。更新前记录undo日志,更新缓冲池(BufferPool)里的数据,记录redo log日志,binlog日志,每一步都有其专门的作用,innoDB通过这套复杂的架构设计,保证了数据更新的高性能和一致性。

IVL秋季赛DOU5求生者两次三出,轻松击败Reborn北京时间12月10日,第五人格2021IVL秋季赛进入到了第九周首日赛程,下面来看看在当日赛程中,DOU5同Reborn的战况。首局比赛上半轮,DOU5在监管者阵营,DongX选出Smlz找不到队伍宣布休息!小草包被下放,DK官宣双上单大家好,这里是锦城,给大家带来2021英雄联盟转会期的最新资讯。2021英雄联盟转会窗将在今天(12月13日)晚上八点关闭,届时将无法在联盟进行转会注册,所以战队的阵容应该都差不多网游防沉迷新规满3个月,效果咋样?来源人民网微信为防止未成年人沉迷网络游戏,切实保护未成年人身心健康,今年8月30日,国家新闻出版署发布关于进一步严格管理切实防止未成年人沉迷网络游戏的通知,规定未成年人仅可在周五周IVL秋季赛XROCK空BAN,Gr轻松击败XROCK北京时间12月12日,第五人格2021IVL秋季赛进入到了第九周最后一日的赛程,下面来看看在当日赛程中Gr同XROCK的战况!首局比赛上半轮,XROCK在监管者阵营,Chz选出雕刻翼星求生血量低怎么办?血量恢复办法分享翼星求生血量低怎么办?在翼星求生中玩家有时候会遇到各种危险导致血量比较低,这时候要如何恢复呢,今天为大家带来了翼星求生血量恢复办法分享,一起来看看吧。翼星求生血量恢复办法分享对于血国风模拟游戏桃源记更新新增成就图鉴系统食物锁定功能提起桃花源,大家的脑海中是否会浮现出阡陌交通,鸡犬相闻的怡然景象?陶渊明笔下的桃花源曾为我们描绘一场人间仙境。在当今快节奏的生活中,大家很难再享受到如桃源静谧安宁的乌托邦生活。如今今天分享一张M4A1的暗色系简约壁纸今天分享一张M4A1的暗色系简约壁纸,感觉自从M4A1加强后好用太多了,虽然没有AK强没有AK爽,但是后座力依然小,精准度还是很高,最近的比赛职业哥们做CT方基本都是买M4A1了哈2021绝地求生在TGA完全免费?别担心老玩家也有福利吃鸡游戏哪家强和早先社会爆料的一样,绝地求生在TGA2021上正式组织宣布变为一个可以免费使用网络游戏,从1月12日开始。2021绝地求生在TGA完全免费?老玩家也有福利!官方公告魔兽世界或将添加性别自定义功能尊重LGBTQ近日数据挖掘者Simaia在魔兽世界9。2永恒的终结中有新发现。在尝试破解PTR文件编码时,他发现名为unitsexconstatntsdocumentation。lua的文件,该英雄联盟手游无限火力正式上线在今天早上无限火力模式已经在国际服上线了,此前通过国际服的活动分析将在10号上线,不出所料的确是这样。通过一天的游玩体验来分析分析目前比较强势的英雄与无限火力模式的机制,也可以为大温泉度假村游戏攻略温泉度假村是一款模拟养成游戏。游戏中无论是人物场景设计都十分的卡通精美画质细腻清晰,再搭配上美妙灵动的背景音效,可为大家带来最舒适的游戏体验。同时副本关卡内容也极为丰富,提供了超多
明日方舟剧情世界观架构分析我感觉明日方舟的剧情不是烂,而是不上不下。按理说剧情很烂的手游简直是一抓一大把。对于这类手游,反正我是压根儿就不看剧情,专注玩法。有些游戏玩儿了好几年都没注意过背景故事,那也一样可明日方舟先锋队分析先锋队无可替代。非先锋队弱于其他六星先锋。推王和凛冬对于先锋队来说都是无可替代的,独特的先锋buff。桃子的先锋回血在有了琴柳之后也不是特别需要了,真要说还有谁不可替代,可能野鬃骑山童新皮霜渊遗境正式上线,山童成平安京新任大众情人玩家对自己能操纵的游戏角色向来都有一个共识,那就是要美(性感),要帅(炫酷)。然而这并不能是小编一进评论区就被诸位裤子绊倒的理由。算算日子,虽说离决战平安京的周年庆越来越近了,但是水晶玫瑰皮肤上热搜,LOLM无底线圈钱,惹玩家众怒弃游最近英雄联盟手游国服折腾的挺凶,随着2。6A版本的推出,又推出了一大波皮肤。细数一下,从开服到现在,游戏的更新,好像没有什么品质化的提升,倒是皮肤出了不少。而皮肤也不单纯的是用买的玩家帮开发商做完游戏赛博朋克2077有了地铁系统mod在赛博朋克2077早期公布的预告片里面,一开场是主角在地铁里站起来游走,然后看向窗外出现了夜之城的景色,那首动感BGM适时响起,画面颇为惊艳,这一幕应该吸引到了很多人入坑,而且也让暗黑破坏神4季度近况更新颠峰面板新引擎等介绍近日暴雪公布了暗黑破坏神4年度最后一集的季度近况说明文章。首席系统设计师JoePiepiora将介绍物品系统重要内容更新项目,包括重出江湖的技能加成物品传奇能力的全新互动机制,以及LEG引擎装备升级脚本,BLUE引擎传奇添加升级装备的NPC示例main尊敬的玩家USERNAME你好,欢迎来到装备升级系统COLORclLime尊敬的玩家USERNAME你好,COLORclLime欢迎来到SERVERNAME升级武器武器等待恐怖游戏恐惧症圣狄福娜酒店于明年推出据游戏开发商MaximumGames于近日公布的消息显示,心理恐怖游戏恐惧症圣狄福娜酒店(FOBIASt。DinfnaHotel)将于2022年发售,本作由Pulsatrix工作室IG全胜晋级,队伍精气神让人欣喜,他们新赛季能成为黑马战队吗?最近IG这只战队还是挺令人惊讶的,在比赛过程中,他们多次carry全场,队伍的精气神是自从S10以来再也没有见到过的。其实IG在S8夺冠之后原本是对S9连冠充满希望的,但由于队伍出幻塔冰风之矢怎么样?冰风之矢武器强度分析幻塔冰风之矢怎么样?幻塔游戏中有着各种各样的武器,很多小伙伴想知道幻塔冰风之矢怎么样,今天为大家带来了冰风之矢武器强度分析,一起来看看吧。幻塔冰风之矢武器强度分析冰风之矢冰风之矢在原来马匹也有这么多要点,你真的了解武侠里的马了吗?作为古代最重要的交通工具。对于武侠世界来说,同样有着非常重要的作用。但是有时候我们也不由得会想到,马匹真的只是一个简单的代步工具吗?如果在武侠世界里面,马匹是不是会有其他的作用和特