InnoDB体系结构学习笔记
后台线程
Master Thread
核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括(脏页的刷新)、合并插入缓冲、(UNDO页的回收)等
IO Thread
4个write、4个read、1个insert buffer、1个log
参数innodb_read_io_threads和innodb_write_io_threads可以进行设置。
Purge Thread
回收已经使用并分配的UNDO页。(从Innodb 1.1版本开始独立线程)
从Innodb 1.2版本开始,Innodb支持多个Purge Thread,进一步加快UNDO页的回收。同时由于Purge Thread需要离散的读取UNDO页,这样能更进一步利用磁盘的随机读取性能。
Page Cleaner Thread
在Innodb 1.2版本中引入,将之前版本中脏页的刷新操作都放入到单独的线程中完成。减轻Master Thread的工作以及用户查询线程的堵塞,进一步提高InnoDB存储引擎的性能。
内存
缓冲池
缓冲池的配置通过参数innodb_buffer_pool_size来设置。
show variables like 'innodb_buffer_pool_size';
缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引、Innodb存储的锁信息(lock info)、数据字典信息(data dictionary)等。
从InnoDB 1.0.x版本开始,允许有多个缓冲池示例。每个页根据哈希值平均分配到不同的缓冲池中。好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。通过参数innodb_buffer_pool_instances来进行配置,默认为1。
show variables like 'innodb_buffer_pool_instances';
LRU List、Free List和Flush List
数据库中的缓冲池通常是通过LRU(Latest Recent Used,最近最少使用)算法进行管理的。即最频繁进行的页在LRU列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读到的页时,将首先释放LRU列表中的尾端的页。
InnoDB的缓冲池对传统的LRU算法做了一些优化。在LRU列表中还加入了midpoint位置。新读取到的页,虽然是最新访问的页,但并不是直接放入到LRU列表的首部,而是放入LRU列表的midpoint位置。这个算法在InnoDB存储引擎下称为midpoint insertion strategy。默认情况下位置在LRU列表长度的5/8处。通过参数innodb_old_blocks_pct控制。
为什么不使用传统的LRU算法,如果直接将读取到的页放入到LRU的首部,那么某些SQL操作可能会是缓冲池中的页全部被刷出,从而影响缓冲池的效率。常见的这类操作为索引或数据的扫描操作。这类操作需要访问表中的许多页,甚至是全部的页,而这些页仅仅是这次操作需要的,并不是热点数据。
同时,InnoDB使用参数innodb_old_blocks_time管理页读取到midpoint位置后等待多久才会被加入到LRU的热端(midpoint之前的称为new列表热端,之后的列表称为old列表)。可以通过下面的设置尽可能使LRU列表中热点数据不被刷出。
set global innodb_old_blocks_time = 1000;
如果预估自己的热点数据不止63%,那么通过下面的设置来减少热点页的刷出,但是还是会被刷出。
set global innodb_old_blocks_time = 20;
当数据库刚启动时,LRU列表是空的,即没有任何的页。这是页都存放在Free列表中,当需要从缓冲池中分页时,首先从Free列表中查找是否可用的空闲页,若有则从Free列表中删除,放入到LRU列表中。否则,根据LRU算法,淘汰LRU列表末尾的页,分配给新的页。
当页从LRU列表的old部分加入到new部分时,称此时发生的操作为page made young,而因为innodb_old_blocks_time的设置而导致没有从old部分变为new部分的操作称为page not made young。
通过命令查看LRU列表及Free列表的使用状况。
show engine innodb status\G;
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 417853
Buffer pool size 8191
Free buffers 7724
Database pages 467
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 433, created 34, written 36
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 467, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
在LRU列表中的页被修改后,称该页为脏页,即缓冲池中的页和磁盘上的页的数据产生了不一致。这是数据库会通过CHECKPOINT机制将脏页刷新回磁盘,而Flush列表中的页即为脏页列表。注意:脏页即存在于LRU列表中,也存在于Flush列表中。LRU列表管理缓冲池中页的可用性,Flush列表用来管理页刷新回磁盘,二者不影响。
重做日志缓冲
InnoDB存储引擎首先将重做日志信息放入重做日志缓冲区,然后按照一定的频率将其刷入到重做日志文件。由参数innodb_log_buffer_size控制,默认为8M。
重做日志在下面三种情况下会把重做日志缓冲中的内容刷新到外部磁盘的重做日志文件中。
- Master Thread每一秒将重做日志缓冲刷新到重做日志文件。
- 每个事物提交时会将重做日志缓冲刷新到重做日志文件。
- 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。
Checkpoint技术
如果使用Update或Delete操作,改变了页中的记录,那么此时页是脏的,即缓冲池中的页的版本比磁盘的新。数据库需要将新版本的数据从缓冲池刷新到磁盘。
但是不能每一次变化,都将新页的数据刷新到磁盘。一方面开销太大,再就是如果在刷新过程中发生了宕机,那么数据不能恢复,为了避免发生数据丢失的问题,数据库普遍采用Write Ahead Log策略,即当事务做日志提交时,先写重做日志,再修改页。如果发生宕机,通过重做日志文件来完成数据的恢复。
如果缓冲池缓存数据库中所有的数据,而且重做日志能够无线的增大,那么不需要将缓冲池中的新版本刷新回磁盘。因为发生宕机的时候通过重做日志文件就可以恢复整个数据库系统中的数据到宕机发生的时刻。但是这需要两个条件:1.缓冲池可以缓存数据库所有的数据,2.重做日志能够无限增大。这几乎是不可能的(原因就不说了...),而且就算满足条件,宕机数据库恢复的时间会非常久。(说到底,就是得用Checkpoint技术,实现分批定时将数据刷新到磁盘)
Checkpoint(检查点)技术目的是解决如下问题:
- 缩短数据库的恢复时间;当发生宕机时,数据库不需要重做所有的日志,因为Checkpoint之前的页都已经刷新到磁盘。
- 缓冲池不够用时,将脏页刷新到磁盘;当缓冲池不够用时,根据LRU算法会溢出最近最少使用的页,若此页为脏页,那么需要强制执行Checkpoint,将脏页也就是新版本刷回磁盘。
- 重做日志不可用时,刷新脏页。所谓的不可用,是指重做日志的设计是循环使用的,并不是让其无限增大的,重做日志可以被重用的部分是指这些重做日志已经不再需要(应该是已经被刷回到磁盘),发生宕机时,恢复操作不需要这部分重做日志,因此这部分可以被覆盖重用,也即是上面说的重做日志不可用,但是如果想要使用不可用的重做日志,就需要强制使用Checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置(这里和下面的分析有一些冲突)。
对于InnoDB存储引擎,通过LSN来标记版本的。而LSN是8个字节的数字,每个月有LSN,重做日志有LSN,Checkpoint也有LSN。
通过命令查看LSN。
show engine innodb status\G;
LOG
---
Log sequence number 33646077360
Log flushed up to 33646077360
Last checkpoint at 33646077360
0 pending log writes, 0 pending chkp writes
49687445 log i/o's done, 1.25 log i/o's/second
在InnoDB存储引擎有两种Checkpoint,分别是:
- Sharp Checkpoint
- Fuzzy Checkpoint
Sharp Checkpoint发生在数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作方式,即参数innodb_fast_shutdown = 1。
在内部使用Fuzzy Checkpoint进行页的刷新,即只刷新部分脏页,而不是刷新所有的脏页回磁盘。
可以分为如下一些情况:
- Master Thread Checkpoint
- FLUSH_LRU_LIST_Checkpoint
- Async/Sync Flush Checkpoint
- Dirty Page too much Checkpoint
对于Master Thread Checkpoint,差不错以每秒或者每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘。这个过程是异步的,即此时InnoDB可以进行其他操作。
FLUSH_LRU_LIST_Checkpoint是因为InnoDB需要保证LRU列表中需要有差不多100个空闲页可使用。如果没有100个空闲页,那么InnoDB会将LRU列表尾端的页移除。如果这些页中有脏页,那么需要进行Checkpoint,而这些页来自LRU列表。从MySql 5.6版本开始,这个检查工作被放在一个单独的Page Cleaner线程中进行,并且用户可以通过参数innodb_lru_scan_depth控制LRU列表中可用页的数量,默认为1024。
Async/Sync Flush Checkpoint指的是重做日志不可用的情况,这是需要强制将一些页刷新回磁盘(这里和上面的分析有一些冲突,希望可以交流学习),而此时是从脏页列表中选取的。这包含一系列的触发的判断条件,目的是为了保证重做日志的循环使用的可用性。在InnoDB 1.2.x版本之前,Async Flush Checkpoint会阻塞发现问题的用户查询线程,而Sync Flush Checkpoint会阻塞所有的用户查询线程,并且等待脏页刷新完成。从InnoDB 1.2.x版本以后,也就是MySQL 5.6版本,这部分被放到单独的Page Cleaner Thread中,不会阻塞用户查询线程。
最后一种Checkpoint的情况是Dirty Page too much,即脏页数据太多,导致强制执行Checkpoint。其目的是保证缓冲池中有足够可用的页,由参数innodb_max_drity_pages_pct控制,目前默认值75,即75%。
转载请注明出处。
作者:wuxiwei
出处:http://www.cnblogs.com/wxw16/p/6222624.html
InnoDB体系结构学习笔记的更多相关文章
- Oracle体系结构学习笔记
Oracle体系结构由实例和一组数据文件组成,实例由SGA内存区,SGA意思是共享内存区,由share pool(共享池).data buffer(数据缓冲区).log buffer(日志缓冲区)组成 ...
- Oracle 9i & 10g编程艺术-深入数据库体系结构-学习笔记(持续更新中)
--20170322 --1.0 --更新表的统计信息begin dbms_stats.set_table_stats(user,'EMP',numrows => 10000);end; beg ...
- Java异常体系结构学习笔记
异常类的继承层次 1.Throwable是所有异常类的父类,他也继承自Object.所以Throwable是一个类,而不是接口. 2.Error这个分支的异常是由于Java虚拟机内部错误导 ...
- (1.3)学习笔记之mysql体系结构(C/S整体架构、内存结构、物理存储结构、逻辑结构)
目录 1.学习笔记之mysql体系结构(C/S架构) 2.mysql整体架构 3.存储引擎 4.sql语句处理--SQL层(内存层) 5.服务器内存结构 6.mysql如何使用磁盘空间 7.mysql ...
- java jvm学习笔记二(类装载器的体系结构)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- ARMV8 datasheet学习笔记3:AArch64应用级体系结构
1.前言 本文主要从应用的角度介绍ARMV8的编程模型和存储模型 2. AArch64应用级编程模型 从应用的角度看到的ARM处理器元素: 可见的元素(寄存器/指令) 说明 可见的寄存器 R0-R30 ...
- MySQL学习笔记-MySQL体系结构总览
MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...
- 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构
目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...
随机推荐
- Linux 江湖系列阶段性总结
引言 我使用 Linux 已经有很多年了,最开始接触 Linux 的时候是从 RedHat 9(没有 Enterprise),中途换过 N 个不同的发行版.多年前,我在 BlogJava 上面分享 J ...
- Android Ormlite 学习笔记2 -- 主外键关系
以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...
- kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- 视频 - 在 VirtualBox 中部署 OpenStack
大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂,难道大今天我就先帮大家解决环境问题.前两天我抽空在 ...
- 用scikit-learn学习谱聚类
在谱聚类(spectral clustering)原理总结中,我们对谱聚类的原理做了总结.这里我们就对scikit-learn中谱聚类的使用做一个总结. 1. scikit-learn谱聚类概述 在s ...
- 高频交易算法研发心得--MACD指标算法及应用
凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...
- webapp应用--模拟电子书翻页效果
前言: 现在移动互联网发展火热,手机上网的用户越来越多,甚至大有超过pc访问的趋势.所以,用web程序做出仿原生效果的移动应用,也变得越来越流行了.这种程序也就是我们常说的单页应用程序,它也有一个英文 ...
- JavaScript中事件处理
先看看下面一道题目,请评价以下代码并给出改进意见: if (window.addEventListener) {//标准浏览器 var addListener = function(el, type, ...
- 手把手教你写一个RN小程序!
时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...
- %iowait和CPU使用率的正确认知
resources 理解 %IOWAIT (%WIO) LINUX系统的CPU使用率和LOAD Linux Performance Observability Tools How Linux CPU ...