下图简单显示了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. Spring整合JMS(三)——MessageConverter介绍

    原文链接:http://haohaoxuexi.iteye.com/blog/1900937 1.4     消息转换器MessageConverter MessageConverter的作用主要有两 ...

  2. BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]

    2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...

  3. 【WC2013】糖果公园 [树上莫队]

    题意: 一棵树,修改一个点的颜色,询问两点路径上每种颜色的权值$val[c]$*出现次数的权值$cou[w[c]]$的和 sro VFK 树上莫队 按照王室联邦的方法分块,块的大小直径个数有保证,并不 ...

  4. qt中的tcp编程

    server .server.h #define DIALOG_H #include <QDialog> #include <QTcpServer> #include < ...

  5. stderr,stdout,a.txt缓冲区别

    #include<stdlib.h>#include<stdio.h>#include<string.h>#include<error.h>#inclu ...

  6. js分页功能实现

    实现一个js的分页并在弹出框中显示 1.分页插件使用:bootstarp-paginator.js,需要先引入bootstarp.js和jquery.js等: !function($){"u ...

  7. thinkphp5判断移动或pc端访问并调用不同模板

    废话不多说,直接上代码 先修改\thinkphp\library\think\view\driver\Think.php文件 把 public function __construct($config ...

  8. 在 ASP.NET Core 项目中实现小写的路由URL

    在 ASP.NET MVC 早期版本中,我们可以通过在应用的 RegisterRoutes 方法中设置 routes.LowercaseUrls = true ; 来将页面的 URL 链接转小写.在 ...

  9. yii2高级模板使用一个域名管理前后台

    yii2的高级模板分为backend和frontend,最开始用yii的时候并没怎么在意,就使用了两个域名分别解析前后台.今天无意间看见 可以使用一个域名指向前后台. 1.修改 advanced/ba ...

  10. 用Open SSH生成公钥和私钥(Win)

    也可以使用 dsa 加密算法进行加密,命令如下: ssh-keygen -t dsa