InnoDB 存储引擎体系架构

首先以一张图简单展现 InnoDB 的存储引擎的体系架构.从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责以下工做:mysql

  • 维护全部进程/线程须要访问的多个内部数据结构git

  • 缓存磁盘上的数据, 方便快速读取, 同时在对磁盘文件修改以前进行缓存github

  • 重作日志(redo log)缓冲sql

图片描述

后台线程的主要做用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最新数据;将已修改数据文件刷新到磁盘文件;保证数据库发生异常时 InnoDB 能恢复到正常运行 的状态数据库

后台线程

InnoDB 使用的是多线程模型, 其后台有多个不一样的线程负责处理不一样的任务缓存

1. Master Thread

这是最核心的一个线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括赃页的刷新、合并插入缓冲、UNDO 页的回收等.数据结构

2. IO Thread

在 InnoDB 存储引擎中大量使用了异步 IO 来处理写 IO 请求, IO Thread 的工做主要是负责这些 IO 请求的回调.多线程

能够经过命令来观察 InnoDB 中的 IO Thread:架构

mysql> SHOW ENGINE INNODB STATUS\G
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2016-03-23 20:19:53 0x700000d51000 INNODB MONITOR OUTPUT
....
...
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
......
----------------------------
END OF INNODB MONITOR OUTPUT

能够看到, InnoDB 共有10个 IO Thread, 分别是 4个 write、4个 read、1个 insert buffer和1个 log thread.异步

3. Perge Thread

事物被提交以后, undo log 可能再也不须要,所以须要 Purge Thread 来回收已经使用比分配的 undo页. InnoDB 支持多个 Purge Thread, 这样作能够加快 undo 页的回收
InnoDB 引擎默认设置为4个 Purge Thread:

mysql> SHOW VARIABLES LIKE "innodb_purge_threads"\G
*************************** 1. row ***************************
Variable_name: innodb_purge_threads
        Value: 4
1 row in set (0.00 sec)

4. Page Cleaner Thread

Page Cleaner Thread 是新引入的,其做用是将以前版本中脏页的刷新操做都放入单独的线程中来完成,这样减轻了 Master Thread 的工做及对于用户查询线程的阻塞

内存

1. 缓冲池

InnoDB 存储引擎是基于磁盘存储的,其中的记录按照页的方式进行管理,因为 CPU 速度和磁盘速度之间的鸿沟, InnoDB 引擎使用缓冲池技术来提升数据库的总体性能.

缓冲池简单来讲就是一块内存区域.在数据库中进行读取页的操做,首先将从磁盘读到的页存放在缓冲池中,下一次读取相同的页时,首先判断该页是否是在缓冲池中,若在,称该页在缓冲池中被命中,直接读取该页.不然,读取磁盘上的页.

对于数据库中页的修改操做,首先修改在缓冲池中页,而后再以必定的频率刷新到磁盘,并非每次页发生改变就刷新回磁盘.

缓冲池的大小直接影响数据库的总体性能,对于 InnoDB 存储引擎而言,缓冲池配置经过参数 innodb_buffer_pool_size 来设置. 下面显示本机虚拟机上一台 MySQL 数据库配置:

mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size'\G
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_size
        Value: 134217728
1 row in set (0.00 sec)

缓冲池中缓存的数据页类型有:索引页、数据页、 undo 页、插入缓冲、自适应哈希索引、 InnoDB 的锁信息、数据字典信息等.索引页和数据页占缓冲池的很大一部分.
下图显示 InnoDB 存储引擎总内存的结构状况.

图片描述

2. 重作日志缓冲

InnoDB 存储引擎先将重作日志信息放入这个缓冲区,而后以必定频率将其刷新到重作日志文件.重作日志文件通常不须要设置得很大,由于在下列三种状况下重作日志缓冲中的内容会刷新到磁盘的重作日志文件中.

  1. Master Thread 每一秒将重作日志缓冲刷新到重作日志文件

  2. 每一个事物提交时会将重作日志缓冲刷新到重作日志文件

  3. 当重作日志缓冲剩余空间小于1/2时,重作日志缓冲刷新到重作日志文件

3. 额外的内存池

在 InnoDB 存储引擎中, 对一些数据结构自己的内存进行分配时,须要从额外的内存池中进行申请.例如,分配了缓冲池,可是每一个缓冲池中的帧缓冲还有对应的缓冲控制对象,这些对象记录以一些诸如 LRU, 锁,等待等信息,而这个对象的内存须要从额外的内存池中申请.

个人博客: http://ygmyth.github.io