1、innoDB存储引擎体系架构

  

  如上图所示,innoDB存储是基于磁盘存储的,并且其中的记录以页的方式进行管理,但为什么要引入一个内存池呢?

  其目的就是为了协调CUP速度与磁盘速度的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能(简单来说就是通过内存的速度来弥补磁盘速度较慢对数据库性能的影响)

2、内存池的管理

  既然内存池能提高数据库的整体性能,那么innoDB是怎么对这块内存区域进行管理的呢?这里就要介绍一种算法和一种机制

2.1、LUR列表

  

  上图就是一个LUR列表,上图的LUR链表氛围new(热点)区和old(淘汰)区,new和old之间的位置称为midpoint,其余的还有free(空闲)列表等

  先来说查询情况,在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,下一次在读相同页的时候,首先判断该页是否在缓冲池,若在缓冲池中,则直接读取该页,否则读取磁盘上的页

  对于数据库中页的修改操作,首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上,页不是在每次发生更新时触发的,而是根据一种checkpoint的机制刷新会磁盘

2.2、LUR(最近最少使用)算法

2.2.1、LUR列表是通过什么方式管理数据的?

  LUR(最近最少使用)算法,当新查询进来时,innoDB会从free列表中拿出可用的页,放到LUR列表中,然后从free列表删除该页,如果LRU列表溢出,那么就会淘汰掉LRU列表(old区)末尾的页,同时把新的页放到old区列首

2.2.2、old区的数据什么时候能加入到new区?

  在old列表存留了innodb_old_blocks_time所配置的时间之后下一次查询还能在old区中命中缓存,则加入到new区,如果new区溢出,则溢出的页则放到old区

2.3、Checkpoint机制

  Checkpoint机制指得就是将缓冲池的脏页数据刷新到磁盘

  如果在缓冲池将页的数据刷新到磁盘时发生了宕机,那么数据就无法恢复了,所以事务数据库系统都会采用一种Write Ahead Log策略,即当事务提交时,先写重做日志,再修改页,因为宕机而导致数据丢失时,可以通过重做日志完成数据的恢复

2.3.1、Checkpoint机制触发点

  (1)Sharp Checkpoint

    在数据库关闭时,将所有的脏页都刷新到磁盘,如果在数据库运行时使用Sharp Checkpoint,那么数据库的可用性就会收到很大的影响

  (2)Fuzzy Checkpoint

    每次刷新一部分脏页,因此InnoDB存储引擎内部使用Fuzzy Checkpoint进行页的刷新

2.3.2 Fuzzy Checkpoint

  Fuzzy Checkpoint 有一下4种方式

  (1)Master Thread Checkpoint

  在Master Thread中发生的Checkpoint,以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘,过程是异步的,所以InnoDB存储引擎可以机芯其他操作,用户查询线程不会阻塞

  (2)FLUSH_LRU_LIST Checkpoint

  InnoDB存储引擎需要保证LRU列表中需要有100个空闲页可以使用(为了保证有足够的可用空间给用户查询线程中,不会阻塞线程的查询操作)

  如果没有100个空闲页,LRU算法会清除掉LRU列表(old区)尾端的页,此时如果有脏页,则需要进行CheckPoint

  (3)Async/Sync Flush Checkpoint

  指重做日志不可用时(这部分日志已经不再需要了,可以进行清除),刷新脏页到磁盘(如果这时的重做日志还有脏页,则必须要刷新到磁盘)

  (4)Dirty Page too much Checkpoint

  脏页数据太多,导致InnoDB存储引擎强制进行Checkpoint,目的总的来说还是为了保证缓冲池有足够可用的页

2.3.2、Checkpoint机制解决的问题

  (1)缩短数据库的恢复时间

  当数据库发生宕机时,数据库不需要重做所有的日志,因为checkpoint之前的页都已经刷新回磁盘了,所以只需要对checkPoint后的重做日志进行恢复(增量恢复)

  (2)缓冲池不够用时,将脏页刷新到磁盘

  因为LRU算法会清楚掉最近最少使用的页,如果清除的包含脏页,那么需要强制执行checkPoint,将脏页刷新到磁盘

  (3)重做日志不可用时,刷新脏页

  重做日志不可用指得是:这部分日志已经不再需要了,可以进行清除(节省空间,新的重做日志可以复用这部分的空间),但是如果这部分的日志还有脏页数据(需要使用),那么必须强制产生Checkpoint,将缓冲池中的页至少刷新到磁盘到当前重做日志的位置

参考资料:

MySQL技术内幕InnoDB存储引擎第二版

https://blog.51cto.com/14227759/2384690?source=dra

https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html

innodb存储引擎之内存的更多相关文章

  1. InnoDB存储引擎介绍-(1)InnoDB存储引擎结构

    首先以一张图简单展示 InnoDB 的存储引擎的体系架构. 从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作: 维护所有进程/线程需要访问的多个内部数 ...

  2. 《Mysql技术内幕,Innodb存储引擎》——Innodb体系结构

    Innodb体系结构 Innodb存储引擎主要包括内存池以及后台线程. 内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据.缓存磁盘数据,修改文件前先修改内存.redo log 后台线程: ...

  3. 【MySQL】(二)InnoDB存储引擎

    InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracel数据库的架构.通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoDB的存在,才使My ...

  4. INNODB存储引擎之缓冲池

    以下的资料总结自:官方文档和<MySQL技术内幕-INNODB存储引擎>一书. 对INNODB存储引擎缓冲池的那一段描述来自博文:http://www.ywnds.com/?p=9886说 ...

  5. MySQL技术内幕InnoDB存储引擎(二)——InnoDB存储引擎

    1.概述 是一个高性能.高可用.高扩展的存储引擎. 2.InnoDB体系架构 InnoDB存储引擎主要由内存池和后台线程构成. 其中,内存池由许多个内存块组成,作用如下: 维护所有进程和线程需要访问的 ...

  6. Galera集群server.cnf参数调整--Innodb存储引擎内存相关参数(一)

    在innodb引擎中,内存的组成主要有三部分:缓冲池(buffer pool),重做日志缓存(redo log buffer),额外的内存池(additional memory pool).

  7. InnoDB存储引擎内存缓冲池管理技术——LRU List、Free List、Flush List

    InnoDB是事务安全的MySQL存储引擎,野山谷OLTP应用中核心表的首选存储引擎.他是基于表的存储引擎,而不是基于数据库的.其特点是行锁设计.支持MVCC.支持外键.提供一致性非锁定读,同时被设计 ...

  8. InnoDB 存储引擎的线程与内存池

    InnoDB 存储引擎的线程与内存池   InnoDB体系结构如下: 后台线程: 1.后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据: 2.另外,将以修改的数据文件刷 ...

  9. MySQL数据库和InnoDB存储引擎文件

    参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...

随机推荐

  1. Windows10系统python环境下安装Dlib库(转载,蔡军帅亲测可用)

    Dlib是一个很优秀的机器学习库,最近做人脸识别要用到这个库,简要记录一下配置过程,准备工作: 1.python环境 2.安装好pip(这里有个简单的安装教程) 3.Dlib包,贴一个我安装的版本,链 ...

  2. Ubuntu开放指定端口

    一般情况下,ubuntu安装好的时候,iptables会被安装上,如果没有的话那就安装上吧 安装 在终端输入 sudo apt-get install iptables 添加规则 在终端输入 ipta ...

  3. Product - 产品经理 - 转型

    特别说明 本文是已读书籍的学习笔记和内容摘要,原文内容有少部分改动,并添加一些相关信息,但总体不影响原文表达. - ISBN: 9787568041591 - https://book.douban. ...

  4. js有序数组中插入一个元素,并有序的输出

    题目:比较传入函数的参数,将参数组成数组,从小到大排序,返回新的数组. 如: insert();console.log(arr); //[] insert(-1,-2); console.log(ar ...

  5. 【CodeForces - 707B】Bakery(思维水题)

    Bakery Descriptions 玛莎想在从1到n的n个城市中开一家自己的面包店,在其中一个城市烘焙松饼. 为了在她的面包房烘焙松饼,玛莎需要从一些储存的地方建立面粉供应.只有k个仓库,位于不同 ...

  6. docker笔记(2)——docker镜像操作

    操作环境:mac OS 10.14.6 docker版本:10.03.1 终端:iterm2 3.3 时间:2019年8月 docker 镜像,是运行容器的模板,通过pull操作会向指定仓库获取镜像, ...

  7. Laravel注册登陆认证API

    注册接口 路由api.php:Route::post('register', 'Auth\RegisterController@register'); 控制器 http//controllers/au ...

  8. spring_mvc入门项目的小总结

    1.先搭建一个maven的web项目 ,然后把文件夹完善一下,创建一个java的文件夹和resource的问件夹,并指定他们各自的功能. 导入pom.xml文件的依赖 <properties&g ...

  9. Kafka主题体系架构-复制、故障转移和并行处理

    本文讨论了Kafka主题的体系架构,讨论了如何将分区用于故障转移和并行处理. Kafka主题,日志和分区 Kafka将主题存储在日志中.主题日志分为多个分区.Kafka将日志的分区分布在多个服务器或磁 ...

  10. 跨域以及WebService对跨域的支持

    无耻收藏该博主的成果啦!https://www.cnblogs.com/yangecnu/p/introduce-cross-domain.html 通过域验证访问WebService:https:/ ...