中间件-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中恢复数据库的恢复耗时过长

checkpoint定义了很多执行点,当到达某个执行点时执行将缓冲区数据刷入磁盘,不同类型的Checkpoint刷入磁盘页数量不同。这样当数据看宕机时,只需要对Checkpoint之后的重做日志进行恢复,缩短恢复时间