概述:
InnoDB存储引擎版本
InnoDB体系结构
InnoDB存储引擎有很多内存块,构成了一个大的内存池
后台线程
innodb是多线程的,不同后台线程处理不同任务。
Master Thread
IO Thread:
负责IO请求的回调处理。
Purge Thread:
事务被提交后,其所使用的undolog可能不再需要,该线程来回收已经使用并分配的undo页
Page Cleaner Thread:
将之前版本的脏页刷新操作都放入到单独的线程中完成。
内存
缓冲池
基于磁盘存储,以页方式管理。将从磁盘中读出的页存放在缓存池中。下次读到相同的页时,先判断是否在缓存池中,无则读取磁盘上的页。
修改页:先修改缓存池中的页,再将其刷新到磁盘中。(CheckPoint机制)
数据页类型有:索引页,数据页,undo页,插入缓冲等。
允许有多个缓冲池实例,增强数据库并发能力 。
LRU List,Free List,Flush List
LRU算法来管理缓冲池。将新页加入midpoint位置,在LRU列表的5/8处。old列表,midpoint,new列表(最为活跃的热点数据)。
问题:为什么不使用朴素的LRU算法?
innodb_old_blocks_time,表示新页会在多久之后加入LRU列表中的热端。
LRU列表管理已经读取的页,开始时所有的页都在Free列表中,先从Free列表中查找有无可用的空闲表,在Free中删除它,将它加入LRU列表中。
page made young:将页从LRU列表的old部分加入到new部分。
page not made young:因为innodb_old_blocks_time的原因,页没有从old移到new。
Free buffers +Database pages < Buffer pool size。
Buffer pool hit rate缓存池命中率,越接近缓存池运行状态越良好。
LRU列表中的页(存在于LRU列表中)被修改后,该页被称为脏页,即缓存池中的页与磁盘中的页数据不一致。
Flush列表中的页即为脏页列表。
重做日志缓存(redo log buffer)
将重做日志信息先放入到这个缓存区中,然后将其刷新到重做日志文件中。
额外的内存池
对内存的管理是通过一种称为内存堆的方式进行。即对一些数据结构本身的内存进行分配时,先从额外的内存池申请。该区域内存不够再去缓存池中申请。
Checkpoint技术
产生了脏页,将新版本的页从缓冲池中刷新到磁盘。(checkpoint是什么)
当事务提交时,先写重做日志,再修改页。若发生菪机,可通过重做日志进行恢复。
通过重做日志来恢复整个数据库系统的数据到宕机时刻的条件:
1.缓冲池可以缓存数据库中所有的数据
2、重做日志可以无限增大
3.宕机后数据库恢复的时间应该不能太久。
checkpoint技术的目的:
数据库发生宕机不需要重做所有日志,因为checkpoint之前的页都已经刷新到了数据库中。只需要对checkpoint后的重做日志进行恢复。
此外,缓冲此不够时,LRU溢出最近最少使用的页,若该页是脏页,checkpoint即强制将其刷新回磁盘。
重做日志不可用的原因:当前事务数据库系统对重做日志的设计都是循环使用的,而非无限增大,只能将其覆盖重用。
两种checkpoint:
1.Sharp checkpoint:在数据库关闭时将所有脏页刷新回磁盘。。
2.Fuzzy checkpoint:只刷新一部分脏页。
.Fuzzy checkpoint还可再分:
Master Thread工作方式
Loop:
background loop
若flush loop中也没有什么事情可以做了,InnoDB存储引擎会切换到suspend_loop,将Master Thread挂起,等待事件的发生。若用户启用(enable)了InnoDB存储引擎,却没有使用任何InnoDB存储引擎的表,那么Master Thread总是处于挂起的状态。
innodb_io_capacity 表示磁盘IO吞吐量。
InnoDB关键特性(没太懂)
2.6.1插入缓冲
2.6.2两次写
2.6.3自适应哈希索引
2.6.4异步lO
2.6.5刷新邻接页