下图简单显示了InnoDB的存储引擎的体系架构,从图可见,InnoDB储存引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:

  • 维护所有进程/线程需要访问的多个内部数据结构
  • 缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存
  • 重做日志(redo log)缓冲

...

后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB 能恢复到正常状态。

后台线程

InnoDB是多线程的模型,其后台包含多个线程,分别负责处理不同的任务。

1. Master Thread

Master Thread 是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER),UNDO页的回收等。

2、IO Thread
为提高数据库写入性能,InnoDB大量采用AIO(Async IO),此线程主要负责这些IO请求的回调处理。
分别包含4个类型的IO Thread。

IO Thread 线程类型 默认线程数
insert buffer thread 1
log thread 1
innodb_read_io_threads 4
innodb_write_io_threads 4

innodb_read_io_threads和innodb_write_io_threads目前分别使用以下两个参数进行设置:

mysql> show variables like 'innodb_version'\G;
*************************** . row ***************************
Variable_name: innodb_version
Value: 5.7.
row in set (0.01 sec)
mysql> show variables like 'innodb_%io_threads'\G;
*************************** . row ***************************
Variable_name: innodb_read_io_threads
Value:
*************************** . row ***************************
Variable_name: innodb_write_io_threads
Value:
rows in set (0.00 sec)

可以通过命令 show engine innodb status\G; 来观察InnoDB 中的IO Thread:

mysql> show engine innodb status\G;
*************************** . row ***************************
Type: InnoDB
Name:
Status:
=====================================
-- :: 0x7f7da844c700 INNODB MONITOR OUTPUT
=====================================
...
------------
TRANSACTIONS
------------
Trx id counter
Purge done for trx's n:o < 0 undo n:o < 0 state: running but idle
History list length
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION , not started
lock struct(s), heap size , row lock(s)
--------
FILE I/O
--------
I/O thread state: waiting for completed aio requests (insert buffer thread)
I/O thread state: waiting for completed aio requests (log thread)
I/O thread state: waiting for completed aio requests (read thread)
I/O thread state: waiting for completed aio requests (read thread)
I/O thread state: waiting for completed aio requests (read thread)
I/O thread state: waiting for completed aio requests (read thread)
I/O thread state: waiting for completed aio requests (write thread)
I/O thread state: waiting for completed aio requests (write thread)
I/O thread state: waiting for completed aio requests (write thread)
I/O thread state: waiting for completed aio requests (write thread)
Pending normal aio reads: [, , , ] , aio writes: [, , , ] ,
ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: ; buffer pool:
OS file reads, OS file writes, OS fsyncs
0.00 reads/s, avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
...
---
LOG
---
..
----------------------
BUFFER POOL AND MEMORY
----------------------
...
--------------
ROW OPERATIONS
--------------
...
----------------------------
END OF INNODB MONITOR OUTPUT
============================

3、Purge(净化) Thread
事务被提交后,其所使用的undo log可能不再需要,因此需要Purge Thread来回收已经使用并分配的undo(回滚)页。
从InnoDB1.2开始支持多个Purge Thread,目的是进一步加快UNDO页的回收,同时为了离散地读取UNDO页,进一步利用磁盘的随机读取性能。

mysql> show variables like 'innodb_purge_threads'\G;
*************************** . row ***************************
Variable_name: innodb_purge_threads
Value:
row in set (0.00 sec)

4、Page Cleaner Thread
在InnoDB 1.2.x版本中引人。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。而其目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。


脏页

linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。

undo页

一个数据库可以存在多个撤销表空间,但是在任意给定时刻都只能使用一个撤销表空间。撤销表空间必须被创建为持久的、本地管理的并且能够自动扩展分配空间的表空间。

2.3 InnoDB 体系架构的更多相关文章

  1. InnoDB体系架构(四)Master Thread工作方式

    Master Thread工作方式 在前面的文章:InnoDB体系架构——后台线程 说到:InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成.这篇具体介绍该线程的具 ...

  2. InnoDB体系架构(三)Checkpoint技术

    Checkpoint技术 前篇 InnoDB体系架构(二)内存 从缓冲池.缓冲池的管理.重做日志缓冲.额外内存缓冲这四个点介绍了InnoDB存储引擎的内存结构,而在将缓冲池的数据刷新到磁盘的过程中使用 ...

  3. InnoDB体系架构(二)内存

    InnoDB体系架构(二)内存 上篇文章 InnoDB体系架构(一)后台线程 介绍了MySQL InnoDB存储引擎后台线程:Master Thread.IO Thread.Purge Thread. ...

  4. InnoDB体系架构(一)后台线程

    InnoDB体系架构——后台线程 上一篇已经了解了MySQL数据库的体系结构 这一篇除了介绍InnoDB存储引擎的体系架构外,同时进一步了解InnoDB的后台线程. InnoDB存储引擎是多线程的模型 ...

  5. InnoDB体系架构

    MySQL支持插件式存储引擎,常用的存储引擎则是MyISAM和InnoDB,通常在OLTP(Online Transaction Processing 在线事务处理)中,我们选择使用InnoDB,所以 ...

  6. InnoDB体系架构总结(二)

    事务 确保事务内的SQL都可以同步执行 要么一起成功 要么一起失败.事务有四个特性原子性 一致性,隔离性,持久性 实现方式 开始事务的时候回家记录记录一个LSN日志序列 当事务执行的时候 会首先在In ...

  7. InnoDB体系架构总结(一)

    缓冲池:    是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响.在数据库中读取的页数据会存放到缓冲池中,下次再读取相同页的时候,会首先判断该页是否在缓冲池中.对于数据库中页的修改操 ...

  8. MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构

    后台线程 1.Master Thread 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread  内存 重做日志在以下三种情况下将重做日志缓存中的内容刷新到 ...

  9. MySQL--InnoDB 体系架构

    InnoDB 体系架构 后台线程 Master Thread Master Thread 是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新.合并插入缓 ...

随机推荐

  1. BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]

    http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...

  2. controller 单元测试

    一般而言,我们写好一个模块后,会对其进行单元测试,再集成到现有的系统中. 但是呢~针对Controller.Service.Dao三层来说,我们最常的是对Service和Dao进行单元测试.然而Con ...

  3. js中sum(2,3,4)和sum(2)(3)(4)都返回9并要求扩展性

    网上有很多关于sum(1)(2)(3),sum(1,2,3)之类的面试题要求输出相同的结果6并要求可以满足扩展,即有多个参数时也能符合题设的要求,所以自己写了部分例子可以大概满足这些面试题的要求 &l ...

  4. GitHub中开启二次验证Two-factor authentication,如何在命令行下更新和上传代码

    最近在使用GitHub管理代码,在git命令行管理代码时候遇到一些问题.如果开起了二次验证(Two-factor authentication两个要素认证),命令行会一直提示输入用户名和密码.查找了一 ...

  5. js到底new了点啥

    在最开始学习js的时候,我看书上写着,创建一个数组,一个对象通常使用new,如下: var arr=new Array(),//arr=[] obj=new Object();//obj={} 到了后 ...

  6. snowflake 分布式唯一ID生成器

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文参考运维生存和开源中国上的代码整理 我的环境是pytho ...

  7. C#委托与事件--简单笔记

    委托 简单记录点东西 适合似懂非懂的朋友看看 委托类型用来定义和响应应用程序中的回调. 借此可以设计各种有面向对象特性的代码模式.下面要说的事件在我看来就是委托的一种实现,再深一步讲,利用委托加事件, ...

  8. kaggle-titanic 数据分析过程

    1. 引入所有需要的包 # -*- coding:utf-8 -*- # 忽略警告 import warnings warnings.filterwarnings('ignore') # 引入数据处理 ...

  9. HDU - 1584 IDA*

    思路:裸的IDA*,估计当前状态至少需要多少距离才能达到目标状态,剪枝即可.每一墩牌只需记录其最上面和最下面的牌型即可完成移动. AC代码 #include <cstdio> #inclu ...

  10. UVA-10954 贪心+优先队列

    贪心策略:每次选取最小的两个数相加,将和作为新的数加入序列,再从里面取两个最小的数...直到只剩下一个数.优先队列正好对付这题. PS :以前在学校OJ做过几乎一毛一样的这题 AC代码: #inclu ...