MySQL--InnoDB 体系架构
InnoDB 体系架构
后台线程
Master Thread
Master Thread 是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO 页的回收等。
IO Thread
在 InnoDB 存储引擎中大量使用了 AIO(Async IO)来处理写 IO 请求,这样可以极大提高数据库的性能。而 IO Thread 的主要工作是负责这些 IO 请求的回调处理。

innodb_read_io_threads 、 innodb_write_io_threads :分别控制 read thread 和 write thread 数量。
Purge Thread
事务被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread 来回收已经被使用并分配的 undo 页。
用户可以在 MySQL 数据库的配置文件中添加如下命令来启用独立的 Purge Thread(默认是 Master Thread 来完成回收工作):
innodb_purge_threads=n //innodb 支持多个 Purge Thread
Page Cleaner Thread
作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。目的是为了减轻原 Master Thread 的工作及对于用户查询线程的阻塞,进一步提高 InnoDB 存储引擎的性能。
内存
缓冲池
在数据库中进行读取页的操作,首先将磁盘读到的页存放在缓冲池中,这个过程称为将页 FIX 在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。
对于数据库中页的修改操作,则首先修改在缓冲池中命中的页,然后再以一定的频率刷新到磁盘上。页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过 Checkpoint 的机制刷新回磁盘。同样,这也是为了提高数据库的整体性能。
innodb_buffer_pool_size 设置缓冲池大小
缓冲池中缓存的数据页类型有:索引页、数据页、undo 页、插入缓冲、自适应哈希索引、InnoDB 存储的锁信息、数据字典信息等。

从 InnoDB 1.0.x 版本开始,允许有多个缓冲池实例。这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。可通过下面的参数进行配置:
innodb_buffer_pool_instances=n //该值默认为 1
从 MySQL 5.6 版本开始,可以通过 information_schema 架构下的表 INNODB_BUFFER_POOL_STATS 来观察缓冲的状态。
LRU List、Free List 和 Flush List
数据库的缓冲池是通过 LRU(Latest Recent Used,最近最少使用) 算法来进行管理的。即最频繁使用的页在 LRU 列表的前端,而最少使用的页在 LRU 列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放 LRU 列表中尾端的页。
在 InnoDB 存储引擎中,缓冲池中的页默认为 16KB。InnoDB 使用的并非是朴素的 LRU 算法。
innodb_old_blocks_pct //控制新读取的页插入到 LRU 列表尾端的位置
innodb_old_blocks_time //控制页读取到 mid 位置后需要等待多久才会被加入到 LRU 列表的热端

当页从 LRU 列表的 old 部分加入到 new 部分时,称此时发生的操作为 page made young,而因为 innodb_old_blocks_time 的设置而导致页没有从 old 部分移动到 new 部分的操作称为 page not made young。
Free buffers 表示当前 Free 列表中也的数量
Database pages 表示 LRU 列表中页的数量
可能的情况是 Free buffers 与 Database pages 的数量之和不等于 Buffer pool size。因为缓冲池中的页还可能会被分配给自适应哈希索引、Lock 信息、Insert Buffer 等页,而这部分页不需要 LRU 算法进行维护,因此不存在于 LRU 列表中。
youngs/s、non-youngs/s 表示每秒这两类操作的次数。
Buffer pool hit rate 表示缓冲池命中率,通常该值不应该小于 95%。若发生小于 95% 这种情况,用户需要观察是否是由于全表扫描引起的 LRU 列表被污染的问题。
Modified db pages 显示了脏页的数量。
可以通过 INNODB_BUFFER_POOL_STATS 来观察缓冲池的运行状态。
可以通过表 INNODB_BUFFER_PAGE_LRU 来观察每个 LRU 列表中每个页的具体信息。
重做日志缓冲
InnoDB 存储引擎首先将重做日志信息先放入到这个缓冲区,然后按一定频率将其刷新到重做日志文件。
重做日志文件一般不需要设置的很大,因为一般情况下每秒会将重做日志缓冲刷新到日志文件,因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可。
innodb_log_buffer_size //默认为 8MB
额外的内存池
在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请。
MySQL--InnoDB 体系架构的更多相关文章
- InnoDB体系架构(二)内存
InnoDB体系架构(二)内存 上篇文章 InnoDB体系架构(一)后台线程 介绍了MySQL InnoDB存储引擎后台线程:Master Thread.IO Thread.Purge Thread. ...
- InnoDB体系架构(一)后台线程
InnoDB体系架构——后台线程 上一篇已经了解了MySQL数据库的体系结构 这一篇除了介绍InnoDB存储引擎的体系架构外,同时进一步了解InnoDB的后台线程. InnoDB存储引擎是多线程的模型 ...
- InnoDB体系架构
MySQL支持插件式存储引擎,常用的存储引擎则是MyISAM和InnoDB,通常在OLTP(Online Transaction Processing 在线事务处理)中,我们选择使用InnoDB,所以 ...
- InnoDB体系架构(四)Master Thread工作方式
Master Thread工作方式 在前面的文章:InnoDB体系架构——后台线程 说到:InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成.这篇具体介绍该线程的具 ...
- InnoDB体系架构(三)Checkpoint技术
Checkpoint技术 前篇 InnoDB体系架构(二)内存 从缓冲池.缓冲池的管理.重做日志缓冲.额外内存缓冲这四个点介绍了InnoDB存储引擎的内存结构,而在将缓冲池的数据刷新到磁盘的过程中使用 ...
- 2.3 InnoDB 体系架构
下图简单显示了InnoDB的存储引擎的体系架构,从图可见,InnoDB储存引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构 缓存磁 ...
- MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构
后台线程 1.Master Thread 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread 内存 重做日志在以下三种情况下将重做日志缓存中的内容刷新到 ...
- MySQL内存体系架构及参数总结 ---图解
http://www.cnblogs.com/kissdb/p/4009614.html 内存结构: Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配 图只做大概参考 全局缓存包 ...
- 18、MySQL内存体系架构及参数总结
内存结构: Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配 图只做大概参考 全局缓存包括: global buffer(全局内存分配总和) = innodb_buffer ...
- mysql的体系架构和存储引擎
定义数据库和实例 数据库:物理操作系统的文件或其他形式文件类型的集合.在mysql数据库中,数据库文件可以是frm.MYD.MYI.ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共享内存 ...
随机推荐
- Window Server 2019 配置篇(6)- 利用组策略实现域内自动安装软件
上次我们建立了WSUS实现了更新管理,那么现在我们需要的是让集群内的客户机(之后会建立在hyper-v集群上)和服务器都能装上三个软件 1. Microsoft Team 2. Notepad++ 3 ...
- Ubuntu安装Python版本管理工具pyenv
gyf@gyf-VirtualBox:~$ git clone https://github.com/yyuu/pyenv.git ~/.pyenvCloning into '/home/gyf/.p ...
- 网卡工作原理和wireshark混杂模式
通过设置网卡为混杂模式就能捕获局域网内所有发包内容,包括非广播包和非发给自己主机的数据包 这是为什么呢? 即主机A发送一个数据包给主机B,我作为主机C怎么也能截获这个数据包呢,原理是什么? 我的网卡为 ...
- UVALive - 7752 Free Figurines
题意:有n个娃娃,如果大娃娃j直接套小娃娃i,则fa[i] = j.若fa[i] = 0,则该娃娃自由.给出每个娃娃初始的父亲,和改变后的父亲,在满足以下合法操作的条件下,问最少需要多少次变换. 1. ...
- asp.net增加指定404页面
对于在asp中添加404页面我并不熟悉,所以刚开始只能在网上找各种资料,网上资源太多,各种借鉴. 1.借鉴网上尝试的第一种方法: 首先,修改应用程序根目录的设置,打开 “web.config” ...
- 抓取屏幕并压缩生成HBITMAP
HBITMAP GetScreenBmp() { HWND hwnd = ::GetDesktopWindow(); HDC hsrc = ::GetDC(hwnd); HDC hmemdc = :: ...
- Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in
原语句: db.carMongoDTO.aggregate({}}}, {}}}) 报错: Exceeded memory limit for $group, but didn't allow ext ...
- FFT各种模板
丑陋敬请谅解: 求两列数的卷积: 递归版: #include <stdio.h> #include <algorithm> #include <math.h> us ...
- junit基础学习之-测试controller层(2)
准备工作: eclipse本身带有junit4,可以直接build path,加入junit. 连接数据库的配置文件需要修改,之前的文件是采用properties+xml文件的形式,但是在测试的时候因 ...
- Centos 7 x86_64 环境Python2.7升级Python3.7.4
升级Python3.7.4 #安装补丁包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...