专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

通过一条语句的执行,深入理解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通过这套复杂的架构设计,保证了数据更新的高性能和一致性。

鱿鱼游戏兔子老头死了,谁来接手他的位置?有3个人选鱿鱼游戏中的老头表面和蔼,其实背地里是个资本主义者,所有游戏都是他一手策划的,而且还亲自参与,想体验一把游戏的快感,老头之所以如此丧心病狂,除了对人性的蔑视外,最主要还是因为得了脑八角亭迷雾玄梁对玄珍的死愧疚不已,为何要烧了妹妹的照片?八角亭迷雾主要围绕着两个案件展开,19年前玄家死了一个花季少女,19年后朱家又死了独子,连续两起案件,闹得这个小城市人心惶惶。不过最紧张的还是玄梁,当年的凶手还没有抓到,自己的女儿S20赛季即将更新,皮肤抢先看,小伙伴们准备好点券了吗?战令的结束,告知我们S19渐渐到了尾声S19战令时间是2020年3月31日2020年6月21日。按照往期赛季更新时间,是战令结束后一周。即将迎来全新赛季S20,预测时间是6月30号八角亭迷雾念玫失贞是假的?木格被骗,田老师恐是睡了念玫的人八角亭迷雾的核心人物念玫,是个长相乖巧,人缘极好的人,但每个人都是两面派,再完美的念玫也一样,在同学眼中看似小猫咪一样的她,却是个性格极度叛逆的人,她反感家里的一切,抗拒爸爸的爱护鱿鱼游戏红衣人贩卖器官,主办方为何不管?跟游戏规则有关鱿鱼游戏只有短短几集,有很多细节都没交代清楚,比如贩卖器官的红衣人,他们为何如此猖狂,敢在神秘组织的眼皮子底线做黑心勾当,关键整场交易牵扯的红衣人非常多,圆形,三角形,甚至正方形都鱿鱼游戏韩美女在糖饼中作弊,红衣人并非看不见,只是默许罢了鱿鱼游戏中有很多精彩刺激的环节,比如一动不能动的木头人,还有充满童年回忆的糖饼,但凡糖饼图案被破坏,参赛者们就会被淘汰。按理说每一场游戏在开始前,都是建立在公平基础上的,所以从参赛皇室战争最强套路之雷电巨人以下是目前全球杯数第一的玩家正在使用的卡组,并且比第二名高了一百杯。该玩家使用了我们在游戏中不常见的雷电巨人,有些皇室老玩家甚至都不知道这张卡,可以说是玩一百局也遇不见一局的卡组。皇室战争传奇卡最为游戏中的最高价值,它们究竟都强在哪?传奇卡是皇室战争中最难获得的卡牌,也是最有价值的,很多玩家会因为开出一张传奇卡高兴很久。而传奇卡和其他普通的卡牌相比它们究竟优越在哪里?强在哪里呢?除了他们六边形冒彩色光芒的炫酷外皇室战争游戏奖励疯狂提升,金币宝箱闪亮来袭,快上线领就在刚刚,皇室战争终于迎来了夏季的大更新。不仅仅是主题赛季的更新,而是卡牌,机制,奖励,部落战等等的全面更新。而在上次更新增加了魔法道具后,大部分玩家的卡牌数量都够了,而最需要的金皇室战争最强卡牌之暗夜石头人今天也是很开心,我的暗夜石头人卡组也是全部都到了满级,所以趁着高兴给大家来写一下这套多年霸占全球榜的强势阵容。满级暗夜石卡组自从暗夜女巫这张卡上线被开发出来后,暗夜石头人组合就一直推荐不玩会遗憾的单机游戏今天给大家介绍一些优秀的单机游戏。相信很多游戏玩家都非常喜欢单机游戏。与网络游戏相比,单机游戏只需要很低的成本,甚至不用花一分钱就能体验到很好的游戏体验。如果你是单机游戏的粉丝,很
有了这块GTX1660Ti我把GTX1060扔进了垃圾桶前言如果要说这世界上哪些男人最能吸引男生的话,我相信NVIDIACEO黄仁勋绝对是榜上有名。这位皮衣男神整天都在埋头苦干的研发让游戏流畅的高性能显卡,还为如何为玩家提供更好的游戏画1级谁能打得过明世隐?东皇我不行,扁鹊我也不行,他简单很多小伙伴们或许觉得明世隐只是一个辅助,伤害根本不高,但其实不然,明世隐1级的战斗能力可是数一数二的,论1级单挑能力,明世隐却是不虚任何人。1级的明世隐基本上都会点1技能,当明世隐高中生手绘吃鸡近战武器,平底锅很好看,撬棍才是最难画的!大家好,我是南美小猴子!绝地求生刺激战场这款游戏已经上线一年时间了,国际服前段时间也迎来了一周年庆。这段时间以来很多玩家对吃鸡游戏又爱又恨的,有时在游戏里会匹配到一些让人头疼的队友我的世界教你建造一个更衣室,里面还有一面镜子是关键!我的世界是一款非常老的游戏了,从最开始发售测试版到现在已经有10年的时间了,在这十年的时间里游戏更新了无数次,其中有很多原有的设定都被改变,很多曾经的小技巧到现在都已经用不上了,然腾讯手游完美世界VS刺激战场,没有对比就没有伤害完美世界已经开测已经接近一个月了,现在的口碑直线下降,让许多的网友已经失望了,而对应的腾讯旗下的绝地求生刺激战场这个没有版号的游戏却是越来越受广大玩家的喜欢,原因在哪里,大家来看看绝地求生为留住中国玩家,蓝洞开始变成舔狗,他做过哪些讨好?哈喽,大家好这里是大能有话说绝地求生这个游戏,大能哥如果要说它火爆,相信很多小伙伴都非常的赞同。但是最近绝地求生的热度也是一跌再跌,从最火爆时的日均150万玩家在线,下降到了现在的不同分段电脑人技能也不一样,星钻会上楼,战神分段惹不起!大家好,我是南美小猴子!绝地求生刺激战场这款游戏上线一年来,深得玩家喜欢。在游戏里每个段位多多少少都会有一些电脑人存在,有了它们,玩家就更加容易积攒到实战经验。不过有细心的小伙伴发说一款游戏来证明你老了,看完回答,才发现网友都是宝藏男女孩啊贪吃蛇,俄罗斯方块,这些游戏大家玩过吗?不要说没有,我才不信。小时候我们都曾和小伙伴们一起打过各种游戏,回忆起来,那都是逝去的青春啊!还记得当年半夜起来偷菜吗?肯定很多小伙伴和小编吞食天地值得怀念,玩家续作也终于上线,满满的怀旧感在以前的FC时代,其实是有着许许多多的好玩儿的游戏,以为那个时候的人们对于画面没有办法进行提升,所以这些制作者们都将一款游戏的重心给放在了游戏性上面,以至于当时的游戏直到现在拿出来Faker惨遭中国神瞎吊打,16全场黑,赛后直言中单就是辣鸡位置FAKER骚话真的是越来越多了。作为电竞名人堂中唯一的LOL选手,FAKER自从出道以来,拿下了3个S赛世界冠军和无数个联赛冠军,被誉为是史上最成功的LOL职业选手,英雄联盟界的乔巨型骷髅一击落命死亡细胞发布动画宣传DLC巨人崛起近日,死亡细胞的开发商MotionTwin在自己的YouTube上,发布了一则自制动画,来宣传即将发布的死亡细胞DLC巨人崛起,大家来看看,这个四处逃窜的小人,是不是有几分像自己刚
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软件