InnoDB存储引擎

innoDB的各个版本对比

image.png

innoDB的整体架构

image.png
后台线程
  • master thread

1.赋值将缓冲池中的数据异步刷到磁盘,保证数据的一致性。

  1. 刷新脏页,合并插入缓冲,UNDO页的回收等
  • IO tread

1.innodb采用AIO来处理写IO,而IO thread就是处理这些IO请求的回调

2.Io thread有:write,read,insert bufeer和log

3.可以通过innodb_read_io_threads和innodb_write_io_threads来设置read和write的线程数,insert bufeer和log固定为1个

image.png
  • purge thread

1.undo log用于存放事务提交前原始的数据,如果事务已经提交了,则undo可以通过purge thread回收

2.可以设置多个purge thread 回收undo 页

  • page cleaner thread

1.将脏页的刷新操作都放入到page cleaner thread

内存
  • 缓冲池

1.innodb中的记录按照页的方式进行管理。

2.将磁盘读到的页放在缓冲池,这个过程称为将页FIX在缓冲区

3.对页修改是先修改缓冲池的页,然后再以一定的频率刷新到磁盘上

4.页从缓存池刷新会磁盘的操作并不是每次页发生变更的时候,而是通过checkpoint机制

5.通过innodb_buffer_pool_size来设置和这个缓冲池大小

6.内存数据对象包含以下,其中缓冲池包含:数据页,插入缓冲,锁信息,索引页,自适应哈希索引,数据字典信息

image.png

7.可以有多个缓冲池实例,每个页根据hash值平均分配到不同的缓冲池实例,这样就减少数据库内部资源竞争

8.innodb_buffer_pool_instances来设置多少个缓冲值实例。

  • LRU List,Free List 和Flush List

1.LRU List,Free List 和Flush List这三个是用来管理缓冲池内容的方式

2.LRU最近最少使用方式,前端存放使用最频繁,最少使用存放尾部。最新读到的页面,将首先存放在尾部。(innodb做了优化,把最新的页存放在midpoint位置,默认是在LRU列表长度的5/8)

3.在innodb中把midpoint之后的称为old,之前的称为new。即new是最活跃的热点数据

4.设置innodb_old_blocks_time,来标识页读取到mid位置后需要等待多久才会被加入到LRU列表的热端

5.数据库刚启动LRU是空的,页都存放在Free列表中,我们获取页,优先从free中获取

  1. LRU列表淘汰的末尾页,将该内存空间分配给新的页

7.当支持压缩页后,页变为 1KB,2KB,4KB和8KB,对于非16KB的页管理,通过unzip_LRU进行管理

8.我们正常得到的LRU页包含unzip_LRU

9.unzip_LRU分配页方法(比如想获取4KB),首先检查4KB的unzip_LRU列表是否有可用的空闲页,没有的话检查8KB的列表,如果有则将8KB分成2个4KB,放入到4KB列表,若还是得不到则从16KB申请一个页,拆分成1个8KB的页,2个4KB的页,分别存放对应的unzip_LRU

10.在LRU列表中被修改的页,我们称之为脏页,通过checkPoint机制将脏页刷新会磁盘,flush列表就是脏页列表

11.脏页即存在于LRU也存在Flush列表(因为还需要使用)

  • redo log buffer
  1. innodb会将重做日志信息放入到这个缓冲区,然后以一定的频率将其刷新到重做日志文件(redo log file)

2.通过设置innodb_log_buffer_size设置这个redo log buffer

3.以下三种情况会将redo log buffer刷新到redo log file:master thread每秒钟会刷新,当事务提交时候,当重做buffer剩余空间大小小于一半

  • 额外的内存池

checkpoint

  • 1.为了避免在内存中脏页还未刷到磁盘,系统宕机导致数据都是,采用了write ahead log
  • 2.write ahead log:即事务提交的时候,先写redo log file(即把redo log buffer 转化为文件)
  • 3.如果redo log file 太大了会导致,数据库启动时候恢复需要很长时间,且成本太高
  • 4.checkPoint:缩短数据库的恢复时间,缓冲池不够用时候将脏页刷新到磁盘,重做日志不可用的时候刷新脏页。
  • 5.宕机之后,checkpont之前的页都已经刷新到磁盘,只需要对checkpoint后的重做日志进行恢复。
  • 6.单缓冲池不够用,LRU会溢出最近最少使用的页溢出,若是脏页则会执行checkpoint,即将脏页刷新到磁盘
  • 7.因为对重做日志都是循环使用的,当我们重做日志快用满了,这个时候如果还想使用重做日志,那么需要把内存中国对应的页给刷到磁盘,才可以覆盖那部分被刷到磁盘页对应的重做日志
    1. checkpoint的类型:sharpCheckPoint
      ,Fuzzy CheckPoint.
  • 9.sharpCheckPoint:发生在数据库关闭时候,将所有的脏页刷新回磁盘,这是默认的工作方式,通过参数innodb_fast_shutdown=1
  • 10.Fuzzy CheckPoint.:master thread checkPoint,FLUSH_LRU_LIST checkPoint,Async/Sync flush check point,Dirty Page too much check point
    1. master thread checkPoint:每个一段时间刷新一定比例,是异步操作。
  • 12.FLUSH_LRU_LIST checkPoint:被移除LRU列表的脏页会被回收.通过page cleaner thread 去操作
  • 13.Async/Sync flush check point:只重做日志不可用,这时候强制将一些页刷新回到磁盘,放入到page cleaner thread 中操作
    1. Dirty Page too much check point:强制刷新一部分脏页到磁盘

masterThread的工作方式

  • 最初该线程内部又多个loop组成,loop,background loop,flush loop,suspend loop

  • loop 分为 每秒操作和每十秒操作,

  • loop 每秒操作:日志缓冲刷新到磁盘,即时事务还没提交(总是),合并插入缓冲(可能),至多刷新100个脏页到磁盘(可能),如果当前没有事务提交,则契合到backgroup loop

  • loop 每十秒操作:刷新100个脏页(可能),合并至多5个插入缓冲(总是),将日志缓冲刷新到磁盘(总是),删除无用的undo(总是),刷新100个或者10个脏页到磁盘

  • background loop:数据库空闲,或者关闭,就会切换到这个循环。

  • background loop:删除无用的undo(总是),合并20个插入缓冲(总是),调到主循环(总是),不断刷新100个页直到符合条件(可能,跳转到flush loop中完成)

  • 如果flsuh loop 没有脏页要刷新,则会切换到suspend_loop,将master thread 挂起

  • 之后的改革就是 合并插入缓冲时候,合并插入缓冲的数量是 innodb_io_capacity的5%,从缓冲区刷新脏页的数量就是innodb_io_capacity

  • 剔除了innodb_adaptive_flushing ,用来判断每次刷新多少脏页

  • 把 刷新脏页的操作转移给page cleaner thread

innodb关键特性

  • 插入缓冲:其是物理页的一部分,不是缓冲区的一个部分,对于插入或者更新的时候,先判断对应的非聚集索引页是否在缓冲池,若是在直接插入,不在的话则先放入到一个insert buffer中,然后在以一定的频率和情况进行insert buffer和辅助索引的叶子结点的merge。需要索引不是唯一且是辅助索引。以后的change buffer 作用与insert buffer一样只是还可以作用于delete等
  • 我们每次删除记录都是现将记录标识位已删除,然后再真正删除

  • 两次写:如果数据写到页,写了一半发生宕机,那么这个页就是被损坏,如果通过redo log无法对其redo 因为redo log 是对页进行物理操作,,写入发生失效,我们先通过页的副本替换页,然后在进行重做。这就是double write

  • double write包含double write buffer 为2M,还有磁盘上128个连续页,大小同样为2M。在对缓冲池的脏页进行刷新时候,并不直接写盘,而是先将脏页数据复制到内存中double write buffer ,然后double write 分为2次 1m的去写,直接同步到磁盘。因为double write的页是连续的所以开销不大,然后我们在将double write buffer 写入各个表空间

  • 我们在恢复空间只需要将double write 页中的数据直接复制到表空间文件,在应用重做日志


    image.png
  • redo 是物理和逻辑日志的结合,每次记录哪个页,发生了什么操作,当我们页被污染了,这个时候再去写,很有可能造成数据不一致。所以需要换一个新的页

  • 为啥redo 不需要 doubble write

  • 这个博客记录了 为啥我们同时需要double write和redo :https://www.cnblogs.com/geaozhang/p/7241744.html

  • 自适应哈希索引:innodb观察到如果给表加上hash索引可以提高速度,即对热点查询建立自适应hash,

  • 异步io:read ahead和脏页的刷新都是依靠AIO

  • 刷新邻接页:刷新一个脏页,发现这个页所在去的所有页,如果是脏页,那么久一起进行刷新,这样的好处是通过AIO将多个IO写入合并为一个

  • 对于不怎么脏的脏页 也刷新了,或者固态硬盘不需要。所以可以关闭

启动,关闭与恢复

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容