美文网首页
2. InnoDB 体系结构

2. InnoDB 体系结构

作者: lsh的学习笔记 | 来源:发表于2020-05-01 12:02 被阅读0次

结构

InnoDB 引擎有多个内存块,组成一个大的内存池,负责如下工作:

  • 维护所有线程需要访问的多个内部数据结构。
  • 缓存磁盘数据,同时在对磁盘数据修改之前缓存。
  • 重做日志(redo log)缓冲。
InnoDB 架构

后台线程

主要作用:

  1. 刷新内存池数据;
  2. 将已修改数据刷盘;
  3. 异常恢复。
后台线程

1. Master 线程

Master 线程是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。

2. IO 线程

在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。

IO 线程的主要工作是:负责这些IO请求的回调(call back)处理

共有10个IO线程,分别是read(4)、write(4)、insert buffer、log IO 线程。使用innodb_read_io_threadsinnodb_write_io_threads参数进行设置。

# 查看 InnoDB 版本;
SHOW VARIABLES LIKE'innodb_version';
# 查看读写线程数
SHOW VARIABLES LIKE'innodb_%io_threads';
# 观察InnoDB中的IO线程:
SHOW ENGINE INNODB STATUS;
status 显示的内容截取

IO线程0是插入缓冲,1是日志,然后是读写,并且读线程ID总是小于写线程。

3. Purge 线程

回收已经使用并分配的undo页。从master线程分离出来。

4. Page Cleaner 线程

刷新脏页。从master线程分离出来。



内存

内存结构

内存结构 内存

1. 缓冲池

1.1 目的

由于CPU速度与磁盘速度之间的鸿沟,基于磁盘存储的数据库系统通常使用缓冲池技术来提高性能。所以,缓冲池的大小直接影响数据库的性能。

1.2 结构

缓冲池结构

1.3 工作方式

读操作:
  1. 从磁盘读页存入缓冲池;
  2. 下次再读相同的页,先去缓冲池找,找不到再去磁盘找。
写操作:
  1. 首先修改缓冲池里的页;
  2. 以一定的频率刷盘(不是每次写都触发刷盘,而是 Checkpoint 机制);
  3. 可以设置多个来降低并发资源竞争,和 ConcurrentHashMap 中的增加计数使用的分治思想一样。

1.4 缓冲池管理策略

通常使用LRU(Latest Recent Used,最近最少使用)算法管理。即最频繁使用的页在LRU列表前端,最少使用的页在尾端。当缓冲池不够用的时候,释放尾端的页。

注意:
自适应索引、Lock信息、Insert Buffer等不需要LRU算法维护。

具体管理策略

LRU 列表

缓冲池每页默认大小16KB。InnoDB对传统LRU列表加入midpoint位置。新读取的页,不直接放到链表头部,而是放入5/8处。

LRU表分为3个:16KB表,8KB表,4KB表。分类管理,以便用来支持压缩页功能。3者之间使用伙伴算法分配内存。

  1. 检查4KB的unzip_LRU列表,检查是否有可用的空闲页;
  2. 若有,则直接使用;
  3. 否则,检查8KB的unzip_LRU列表;
  4. 若能够得到空闲页,将页分成2个4KB页,存放到4KB的unzip_LRU列表;
  5. 若不能得到空闲页,从LRU列表中申请一个16KB的页,将页分为1个8KB的页、2个4KB的页,分别存放到对应的unzip_LRU列表中。
Free 列表

数据库刚启动时,LRU列表是空的,所有的页都在Free列表。

Flush 表

LRU表中的页被修改后,就是脏页(dirty page),即缓冲池中的页和磁盘中的页数据不一致。

注意:脏页既存在于LRU表,也存在于Flush表。LRU表用来提高读性能,Flush表用来将写数据刷盘,功能不一样。



重做日志缓冲

1. 工作方式

  1. 先将重做日志(redo log)放入这个Buffer;
  2. 按照一定频率刷盘。

2. 刷盘策略

  1. Master 线程每秒刷一次;
  2. 每个事务提交时触发刷盘;
  3. 剩余空间小于1/2时刷盘;

3. 大小

一般无需设置很大,因为每秒会刷盘,只要能保证每秒产生的事务量不超过 redo log Buffer 大小即可。



额外的内存池

InnoDB使用内存堆(heap)的方式管理内存。一部分存放数据结构本身,一部分存放管理这些数据结构的管理信息,额外内存池就是存放管理信息。比如管理缓冲控制块(buffer control block),记录了LRU、锁、等待等信息,有点类似进程控制块(process control block)。

增大缓冲池也需要增大额外内存池。

相关文章

  • Mysql体系——整体架构

    内容 Mysql 体系结构 Innodb 体系结构 Innodb 文件 Innodb 特性 一 Mysql 体系结...

  • 2. InnoDB 体系结构

    结构 InnoDB 引擎有多个内存块,组成一个大的内存池,负责如下工作: 维护所有线程需要访问的多个内部数据结构。...

  • 1. Mysql技术内幕-简介及InnoDB体系架构

    Mysql体系结构和存储引擎 Mysql体系结构 InnoDB存储引擎 InnoDB通过使用MVCC来获取高并发性...

  • MySql技术内幕-InnoDB存储引擎(二)

    InnoDB体系架构 InnoDB的存储引擎体系结构如下图所示,从图中可知,InnoDB存储引擎有多个内存块,可以...

  • InnoDB总结

    InnoDB体系结构 Buffer与磁盘 1.page是InnoDB磁盘I/O的最小单位,数据存放于page中,对...

  • innodb体系结构

  • MySQL存储引擎InnoDB1

    来源:MySQL技术内幕:InnoDB存储引擎(第2版) 一:体系结构 Mysql体系结构连接池组件,管理服务和工...

  • mysql innodb体系结构

    1、后台线程 主线程:核心后台线程,主要负责将缓冲中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插...

  • InnoDB存储引擎底层原理

    1.InnoDB体系结构 InnoDB的底层结构主要由2部分组成:内存结构和磁盘结构。 内存结构主要有如下几个部分...

  • 【书 : InnoDB 存储引擎 】目录

    1章 Mysql 体系结构和存储引擎 2章 InnoDB 存储引擎 3章 文件 3.1 参数文件 3.2 日志文件...

网友评论

      本文标题:2. InnoDB 体系结构

      本文链接:https://www.haomeiwen.com/subject/thvfghtx.html