InnoDB存储引擎
InnoDB体系架构
InnoDB存储引擎有多个内存块,这些内存块组成了一个大的内存池
后台线程的主要作用就是负责刷新内存池中的数据,保证缓存池中的内存缓存的是最近的数据。此外,还将已经修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下,InnoDB可以恢复运行到最佳状态。
后台线程(InnDB是一个多线程模型)
#####Master Thread
作用:
一个非常核心的后台进程,负责将缓存池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓存、UNDO页的回收等。
IO Therad
在InnoDB存储引擎中大量使用了AIO(Async IO)—异步时间非阻塞IO,这样可以极大程度上提高数据库的性能。IO Thread的主要工作就是负责这些IO请求的回调
共有四个IO Thread:write 、read、insert buffer、log IO thread
通过命令SHOW ENGINE INNODB STASTUS\G来观察IO Thread
有四个write和read IO Thread
通过innodb_read_io_threads和innodb_write_io_threads参数来进行设置
Purge Thread
作用:
Purge Thread回收已经使用并且已经分配的undo页(事务提交之后,其所使用的Undolog可能就不再需要)
用户需要在MySQL数据库的配置文件中添加如下命令来启用独立的Purge Thread:
innodb_purge_threads=1
Page Cleaner Thread
作用:
将脏页的刷新操作放在单独的线程中完成。减轻Master Thread的工作以及对于用户查询线程的阻塞
内存
缓存池
Innodb存储引擎是基于磁盘存储的(Disk-base Database),将其中的记录按照页来管理。
缓存池的出现,就是为了解决CPU速度和磁盘速度之间的差异,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。读取文件时,首先判断给文件是否在缓存池中(没有就去磁盘上找)。
在修改缓存池中的页时,先以一定频率刷新到缓存池上,然后通过Checkpoint刷新回磁盘。
数据库服务器最好采用64位操作系统,可以使用更多的内存(512GB),32位(只有64GB)。
缓存池的配置通过参数innodb_buffer_pool_size来设置。
缓存池中缓存的数据页类型:
索引页、数据页、Undo页、插入缓存页、自适应哈希索引页(adaptive hash index)、InnoDB存储的锁信息、数据字典信息等。
允许有多个缓存池实例:每个页根据hashcode平均分配到不同的缓存池实例中,减少数据库内部资源的竞争,增加数据库的并发能力。可以通过inodb_buffer_pool_instances来进行配置,通过命令SHOW ENGINE INNODB STATUS可以观察到每个缓存池实例对象运行的状态,还可以通过查看表InnoDB_BUFFER_POOL_STATS来观察缓存的状态(要求在information_schema架构下)
LRU LIST 、FREE LIST 、FLUSH LIST
LRU算法用来管理已经读取的页
数据库中的缓存池是通过LRU(Latest Recent Used,最近最少使用)算法来管理内部的各种类型的页。
LRU解释:将最频繁使用的页放在LRU列表的前端,最少使用的页放在LRU列表的尾端。当缓存池不能存放新读取到的页时,将优先删除列表尾端的页(默认大小为16KB)。
改进:
1、(midpoint insertion strategy):InnoDB中在LRU中加入了midpoint位置,将新读取到的页放在midpoint,而不是直接放在LRU列表首部。默认位置在LRU列表长度63%处(可以通过innodb_old_blocks_pct来控制)
2、设置了参数innodb_old_blocks_time,用于表示页读取到mid位置后需要等待多久才会加入到LRU列表的热端
为什么要对朴素的LRU算法进行改良?