博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.3 InnoDB 体系架构
阅读量:5925 次
发布时间:2019-06-19

本文共 3806 字,大约阅读时间需要 12 分钟。

下图简单显示了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;*************************** 1. row ***************************Variable_name: innodb_version        Value: 5.7.211 row in set (0.01 sec)

 

mysql> show variables like 'innodb_%io_threads'\G;*************************** 1. row ***************************Variable_name: innodb_read_io_threads        Value: 4*************************** 2. row ***************************Variable_name: innodb_write_io_threads        Value: 42 rows in set (0.00 sec)

 

 

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

 

mysql> show engine innodb status\G;*************************** 1. row ***************************  Type: InnoDB  Name:Status:=====================================2018-03-08 21:09:42 0x7f7da844c700 INNODB MONITOR OUTPUT=====================================...------------TRANSACTIONS------------Trx id counter 1284Purge done for trx's n:o < 0 undo n:o < 0 state: running but idleHistory list length 0LIST OF TRANSACTIONS FOR EACH SESSION:---TRANSACTION 421652959029088, not started0 lock struct(s), heap size 1136, 0 row lock(s)--------FILE I/O--------I/O thread 0 state: waiting for completed aio requests (insert buffer thread)I/O thread 1 state: waiting for completed aio requests (log thread)I/O thread 2 state: waiting for completed aio requests (read thread)I/O thread 3 state: waiting for completed aio requests (read thread)I/O thread 4 state: waiting for completed aio requests (read thread)I/O thread 5 state: waiting for completed aio requests (read thread)I/O thread 6 state: waiting for completed aio requests (write thread)I/O thread 7 state: waiting for completed aio requests (write thread)I/O thread 8 state: waiting for completed aio requests (write thread)I/O thread 9 state: waiting for completed aio requests (write thread)Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] , ibuf aio reads:, log i/o's:, sync i/o's:Pending flushes (fsync) log: 0; buffer pool: 0317 OS file reads, 53 OS file writes, 7 OS fsyncs0.00 reads/s, 0 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;*************************** 1. row ***************************Variable_name: innodb_purge_threads        Value: 41 row in set (0.00 sec)

 

 

 

4、Page Cleaner Thread

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

 


 

脏页

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

undo页

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

转载于:https://www.cnblogs.com/tanwt/p/8530987.html

你可能感兴趣的文章
Search in Rotated Sorted Array ||
查看>>
NUC_HomeWork1 -- POJ2067(最短路)
查看>>
卸载mysql
查看>>
二叉树的遍历
查看>>
The Distinguish of the share or static lib in MFC
查看>>
如何导出数据库的数据词典
查看>>
linux下内存释放问题
查看>>
让Java和JavaScript进行交互
查看>>
android 上传文件
查看>>
linux逻辑卷管理
查看>>
java结合testng,利用mysql数据库做数据源的数据驱动实例
查看>>
LINQ之路12:LINQ Operators之数据转换(Projecting)
查看>>
SQL Server:数据库角色
查看>>
多标签主界面使用TRzPageControl
查看>>
对技术的态度—CoolShell 陈皓
查看>>
分享8个超棒的基于HTML5和jQuery的开发教程
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
Http 请求处理流程
查看>>
Linux硬盘速度测试的命令
查看>>
Win10 功能大全
查看>>