中间件-Mysql-Innodb
InnoDB
体系结构
Innodb引擎数据存储由**内存池、后台线程、磁盘文件**组成;
内存池包括:进程、线程使用的**数据结构;磁盘数据缓冲;redo日志缓冲**等;
后台线程
主要工作由IO回调处理、功能性内存块的更新、回收、分配等
- MasterThread:
核心线程,缓冲池数据刷入磁盘(脏页刷新、合并插入缓冲,undo页回收等) - IOThread:AIO处理IO请求,负责IO请求回调处理。分成四类:write、read、insert buffer、log IO Thread
- PurgeThread:从master中分离出来,负责undolog占用的内存**
回收与分配**工作 - PageCleanerThread:从master中分离出来,负责**
脏页的刷新**工作
内存
缓冲池
必要性:InnoDB是磁盘存储,内存缓冲用户提高IO效率,可以极大的提高数据库的整体性能
原理:
- 读取:数据库从磁盘读取页时,现将读到的页放到缓冲池中,下次读取相同的页时直接从缓冲池读取;
- 修改:修改页时首先修改缓冲池的页,然后后台线程在某个条件下刷新的磁盘中。
CheckPoint机制
组成:数据页缓冲、索引页缓冲、插入缓冲、锁信息、自适应哈希,redo log缓冲等
缓冲池机制
LRU列表:维护数据缓冲,保证缓冲中的页是热点数据
- 不是通用的lru算法实现,通用的lru在全表扫描时会导致热点数据页被冲出缓冲区
- LRU列表中加入**
midpoint**进行优化,midpoint是lru列表的某个中间位置下标,将lru分成前后两个子列表; - 第一次磁盘读取的页,先加入到midpoint之后的位置,也就是说加入到上述后子列表,后面再次被访问了再将该页移到lru的顶端
free列表:空闲页列表,维护没有数据的空页,这里类似页的预分配。需要新页时从free列表获取空页,再往空页写数据,最后该页移出free加入到其他列表(如:lru列表)
flush列表:
- lru的页被修改后称为脏页,脏页并不是马上刷新的磁盘,而是通过checkpoint机制刷到磁盘;
- flush列表保存还未刷到磁盘的脏页。脏页既存在lru中也存在flush中,互相不影响;
重做日志缓冲
- 重做日志首先放入缓冲区,然后按照一定频率写入到磁盘重做日志。
- 重做日志缓冲区不用很大,因为重做日志刷入磁盘频率比较高
- masterThread定时将重做日志刷入日志文件
- 每个事务提交时会相见重做日志刷入日志文件
- 重做日志缓冲剩余大小小于50%时,重做日志缓冲会先刷入日志文件
Checkpoint技术
Checkpoint技术用于刷新缓存到磁盘,保证了缓冲页与磁盘页的数据一致性;
这个过程可能会出现如下问题:
- 缓冲页刷入磁盘,每次页修改就刷入磁盘会导致性能下降问题。
- 所以不能每次修改都刷到磁盘
- 数据库宕机,脏页未刷入磁盘导致数据持久化失效
- 持久化是通过redo log实现,解决这个问题的方式就是**
事务提交时先写redo log再修改缓冲页。保证缓冲页都是已经持久化**的
- 持久化是通过redo log实现,解决这个问题的方式就是**
- 虽然得到了保证,若宕机时脏页过多,会导致从redo log中恢复数据库的恢复耗时过长
checkpoint定义了很多执行点,当到达某个执行点时执行将缓冲区数据刷入磁盘,不同类型的Checkpoint刷入磁盘页数量不同。这样当数据看宕机时,只需要对Checkpoint之后的重做日志进行恢复,缩短恢复时间