初识 InnoDB存储引擎
目录
- 一、InnoDB存储引擎概述
- 二、体系架构
- 后台线程
- 内存
- 缓冲池
- LRU列表、Free列表、Flush列表
- 重做日志缓冲
- 额外的内存池
- 参考资料
一、InnoDB存储引擎概述
- InnoDB 是事务安全的 MySQL存储引擎。
- 支持行锁、MVCC、外键
- 提供一致性非锁定读
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。
因此可将其视为基于磁盘的数据库系统(Disk-base Database)。
二、体系架构
InnoDB 存储引擎有多个内存块,可以认为这些内存组成了一个大的内存池,负责如下工作:
- 维护所有进程 / 线程 需要访问的多个内部数据结构;
- 缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存;
- 重做(redo log)缓冲。
…
图1 InnoDB 存储引擎体系架构
后台线程
后台线程主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。
此外,将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下 InnoDB 能恢复到正常的运行状态。
图2 后台线程
内存
图3 InnoDB存储引擎内存结构
缓冲池
缓冲池是一块内存区域,存放各种类型的页。
使用缓冲池技术来通过内存的速度去弥补磁盘速度较慢对数据库性能的影响。
配置参数:innodb_buffer_pool_size
可以允许多个缓冲池实例,每个页根据哈希值平均分配到不同的缓冲池实例中。
作用:减少数据库内部资源竞争,提高并发处理能力。
配置参数:innodb_buffer_pool_instances
在数据库中进行读取页的操作,首先会从磁盘中读取的页放到缓冲池中,下次读取相同页时,看缓冲池是否能命中,能就直接读取,查询操作和修改操作的流程如图3 和图4所示。
图4 查询操作 图5 修改操作
LRU列表、Free列表、Flush列表
LRU(Lastest Recent Used,最近最少使用)
通常,数据库的缓冲池用 LRU 算法来管理。
概念:频繁使用的页放在 LRU列表 的前端,最少使用的页放在尾端。
作用:LRU列表用来管理已读取的页。
较传统的 LRU 做出相应优化:
LRU列表 加入
midpoint
位置(默认在LRU列表长度的 5/8 处),新读的页放在该位置。
midpoint 之后称old列表
(新读取的页放这),midpoint 之前称new列表
(热点数据)。
配置参数:innodb_old_blocks_pct
,默认值37,即 old列表的长度为 37%(约 3/8)。加入
innodb_old_blocks_time
参数
当页读取到 midpoint 位置后,需要等待多久时间才加入到 LRU列表的热端(new列表),默认值1000,即1秒。
当页从 LRU 列表 的 old 部分加入到 new 部分时,此时操作称 page made young
;
因innodb_old_blocks_time
参数的设置而导致页无法 old -> new,则称 page not made young
注意:插入缓冲、锁信息、自适应哈希索引 等页不存在 LRU列表中。
Free列表
空闲列表。下图6,当需要从缓存池中分页时,分页的过程。
图6 分页过程
需要注意的是,当 Free列表中还有空闲页,则说明 LRU列表中页数未固定,还可以从 Free列表中取。
所以此时 midpoint 是动态变化的(如上文提到的,因为 midpoint 位置是按 LRU列表长度百分比进行设置的)。
反之,当 Free列表用完,LRU列表页数固定,则 midpoint 也会固定下来。
Flush列表
Flush列表即脏页列表。
LRU列表中页被修改后,称该页为脏页,即缓冲池和磁盘上的页的数据产生了不一致,缓冲池中的页的版本比磁盘的新。
这时数据库会通过 checkpoint 机制将脏页刷回磁盘。
LRU列表用来管理缓冲池中页的可用性,
Flush列表用来管理将页刷回磁盘。
注意:脏页存在于 LRU列表中,也存在于 Flush列表中。
重做日志缓冲
如上图3所示,InnoDB存储引擎的内存区域除了有缓冲池外,还有重做日志缓冲(redo_log_buffer)和 额外的内存池(innodb_additional_mem_pool_size)。
InnoDB存储引擎首先会把重做日志信息先放到这个缓冲区中,然后再按一定的频率刷到重做日志文件。
刷新频率一般为一秒,所以该区一般不用设置太大,用户只需保证每秒产生的事务量在这个缓冲大小之内即可。
配置参数:innodb_log_buffer_size,默认8MB。
重做日志缓冲中的内容 刷新到 外部磁盘的重做日志文件,有三种情况会触发。
- Master Thread 每秒将重做日志缓冲刷新到重做日志文件;
- 每个事务提交时会将重做日志缓冲刷新到重做日志文件;
- 当重做日志缓冲池剩余空间小于 1/2 时,重做日志缓冲刷新到重做日志文件。
额外的内存池
在 InnoDB 存储引擎中,对内存的管理是通过一种成为内存堆(heap)的方式进行的。
在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请。
每个缓冲池中的帧缓冲(frame buffer)和对应的缓冲控制对象(buffer control block),这些对象记录了一些诸如 LRU、锁、等待等信息,这些对象的内存需要从额外的内存池中进行申请。
因此,在申请了很大的 InnoDB 缓冲池时,也应考虑相应地增加这个值。
参考资料
[1] MySQL技术内幕 InnoDB存储引擎 第2版
初识 InnoDB存储引擎相关推荐
- Mysql技术内幕——InnoDB存储引擎
一.mysql体系结构和存储引擎 1.1.数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. 数据库实例:由数据 ...
- InnoDB 存储引擎中的表锁和行锁详解
各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...
- linux mysql innodb_MySQL innoDB 存储引擎学习篇
master thread的县城优先级别最高.其内部由几个循环(loop)组成:主循环(loop).后台循环(background loop).刷新循环(flush loop).暂停循环(suspen ...
- 《MySQL技术内幕:InnoDB存储引擎第2版》——3.1 参数文件
3.1 参数文件 在第1章中已经介绍过了,当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认 ...
- mysql1033错误存储引擎_【Mysql问题集锦(1)】mysql不能使用innodb存储引擎
案例: 一台服务器,操作系统centos,使用 yum 安装mysql ,之前innodb存储引擎一直是可以用的,某天之后,突然不能用了,使用innodb存储引擎的数据库导入后存储引擎全部变成了myi ...
- mysql 5.7 存储引擎_mysql5.7——innodb存储引擎总结
一.innodb初探: 1.MySQL日志文件: ①:slow.log 文件会记录慢查询日志,当一条语句执行时间超过在配置参数long_query_time中指定的值时,这条语句就会被记录在这个文件中 ...
- mysql技术内幕innodb存储引擎——表索引算法和锁_(转)Mysql技术内幕InnoDB存储引擎-表索引算法和锁...
表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...
- InnoDB 存储引擎体系架构
首先以一张图简单展示 InnoDB 的存储引擎的体系架构.从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作: 维护所有进程/线程需要访问的多个内部数据 ...
- 11、InnoDB存储引擎
InnoDB 是 MySQL 中第一个提供外键约束的存储引擎,而且它对事务的处理能力是其它存储引擎无法与之相比的. MySQL 5.5 版本以后,默认存储引擎由 MyISAM 修改为 InnoDB.I ...
- mysql+如何开发存储引擎_干货!MySQL 的 InnoDB 存储引擎是怎么设计的?
MySQL 里还有什么其他成员呢? 对于 MySQL,要记住.或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图: 遇到问题,或者学习到新知识点时,就 ...
最新文章
- 终于有人把中医“数字化”了 | 极客视频
- linux shell 和 golang 查询服务器硬件信息
- redis有序集合(Zset)
- PowerDesigner12 逆向工程DataBase SQl2005: unable to list the tables 信息
- Javascript数组操作方法
- 设计模式--装饰者(Decorator)模式
- [BZOJ] 3191 [JLOI2013]卡牌游戏
- python画一条水平直线(matplotlib)
- Flink : The object probably contains or references non-serializable fields.
- LINQ to SQL VS LINQ to Entities
- 解决请求筛选模块被配置为拒绝包含的查询字符串过长的请求
- Linq to sql 增删改查
- matlab中制作软件,2020-02-27 MATLAB App Designer——在 App 设计工具中创建辅助函数
- 攻击需要成本吗_光伏智能温室建设成本高吗?需要哪种钢结构?
- Android权限管理及动态申请权限
- oracle 列名sql,SQL查询表名、列名、列属性-Oracle
- 公关营销策划书的要点及分析
- 使用ffmpeg批量合并flv文件
- mac电脑运行很卡不流畅,如何给mac提速?
- 140套高清、超优秀的PPT模板----毕业设计、毕业答辩主题