开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
Mysql最大的特点就是插件式的表存储引擎,存储引擎是基于表的,不是基于数据库的。
InnoDB作为我们现在最常用的存储引擎,下面就简单介绍一下InnoDB存储引擎相关的知识:
InnoDB引擎架构图
后台线程:主要作用是刷新内存池中的数据,保证内存池中的数据是最新的。
后台线程
Master Thread:核心后台线程,主要负责将缓冲池中的数据异步刷新回磁盘,保证数据一致性。包括,脏页刷新,合并插入缓冲、undo页回收等
IO Thread:负责IO请求回调,InnoDB1.0版本之前共有四个IO Thread:write、read、insert buffer、log IO Thread
purge Thread:负责回收那些已经使用并且分配的undo页
Page cleaner Thread:原先Master Thread负责脏页刷新,现在由Page cleaner Thread负责,目的:减轻Master Thread阻塞,提高InnoDB性能
内存
缓冲池:为了减轻cpu跟磁盘的读写速度差距,在内存中开辟某些空间来存放数据库里面的数据。
在缓冲池里面修改了的数据,不是每次发生修改就刷新回磁盘,而是通过一种叫CheckPoint的机制刷新回磁盘
缓冲池里面的数据有:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictiontary)
缓冲池管理算法: LRU List、Free List 、Flush List
LRU(Lastest Recent Use):最频繁使用的页放在LRU列表的前端,最少使用放在后端。
算法优化:InnoDB对LRU算法进行了优化,加入了一个midpoint的位置,最新访问的页不直接放在页前端,而是放在LRU列表midpoint中的位置,默认在5/8处,midpoint之前的称为new列表,后面成为old列表
优化原因:防止只查询一次的数据把热点数据筛选下去
LRU列表分配过程:数据库启动的时候LRU列表为空,空闲也放在Free列表,当需要分页的时候,首先会从Free列表中查询有没有空间页,有就从Free列表中拿一个到LRU列表中去,没有就根据LRU算法,淘汰列表末尾的数据,然后再将得到的内存分配给新的页
InnoDB 1.0.x版本之后支持压缩页,压缩过程如下(LRU列表包括unzip_LRU):
例如从缓冲池中申请页面大小为4K的页。
1、检查4k的unzip_LRU,查看时候有4k的空闲页。
2、如果有就分配
3、否则,检查8k的unzip_LRU列表
4、若能得到空闲页,就将页分成2个4k的,放到4k的unzip_LRU列表
5、得不到就申请16k的,然后分成一个8k,两个4k的unzip_LRU
Flush列表:存放脏页。脏页即存放在Flush列表,也存放在LRU列表
Flush和LRU对比:LRU管理缓冲池中页的可用性,Flush列表将脏页刷新回磁盘
Flush列表:存放脏页。脏页即存放在Flush列表,也存放在LRU列表
Flush和LRU对比:LRU管理缓冲池中页的可用性,Flush列表将脏页刷新回磁盘
重做日志缓冲(redo log buffer)
重做日志缓冲:InnoDB引擎将重做日志的信息存放在重做日志缓冲区,然后按一定的频率刷新回日志文件
以下三种情况会将缓冲区日志刷新到磁盘:
1、Master Thread 每秒将重做日志缓冲刷新到重做日志文件
2、每个事务提交会将重做日志缓冲刷新到重做日志文件
3、重做日志缓冲池的剩余空间少于1/2时,重做日志缓冲刷新到重做日志文件
额外内存池
当缓冲池张内存不足的时候,需要向额外内存池申请空间
CheckPoint技术
事务数据库普遍采用Write Ahead log 策列,即当事务提交时,先写重做日志,再修改页(重做日志可恢复数据)
checkpoint技术的目的:
1、缩短数据库恢复时间
2、缓冲池不够用时,将脏页刷新回磁盘
3、重做日志空间不够时,刷新脏页
checkpoint类型:
1、Sharp Checkpoint :在数据库关闭时将所有脏页刷新回磁盘(默认)
2、Fuzzy Checkpoint:数据库运行是,只刷新一部分脏页回磁盘
InnoDB关键特性
1、插入缓冲(Insert buffer)
2、两次写(Double write)
3、自适应哈希(Adaptive Hash Index)
4、异步IO(Aysn IO)
5、刷新邻接页(Flush Neighbor Page)