《MySQL技术内幕:InnoDB存储引擎》2. InnoDB的体系架构

文章目录

  • 1. 后台线程
    • 1.1 master thread
  • 2. 内存池
    • 1. 缓存池
      • 1. 作用
      • 2. 算法:LRU算法,增加midpoint的LRU算法
    • 2. 缓存池列表
  • 3. 脏页刷新机制:checkpoint机制
    • 1. 脏页:在LRU中被改变的数据
    • 2. checkpoint机制
  • 4. 关键特性
    • 4.1 插入缓冲:insert buffer
    • 4.2 两次写(double write):数据页可靠性
    • 4.3 自适应哈希索引
      • 4.4 异步IO

脏页不直接刷出同步到磁盘:通过两次写double write来同步到磁盘,提高页的可靠性(可禁用,看场景需求)

1. 后台线程

后台线程的主要作用是刷新内存池的数据到磁盘中(master thread)
同时还有其他作用,主要有如下线程

线程 作用
master thread 负责刷新数据
IO thread IO请求回调,有read,write等四个
purge thread 回收undo页
page cleaner thread 脏页刷新

1.1 master thread

在InnoDB1.0和1.2以前都有I/O性能问题,master thread有两个操作,一个是一秒执行一次的操作,一个是10秒执行一次的操作,都是会做一些数据的刷出以及脏页的处理,此时若是需要处理的页数操作了I/O的负荷能力,就会出现问题,此时可以先提升磁盘I/O的性能,通过SSD或者磁盘做RAID,提高了读写能力后,再通过参数设置InnoDB的磁盘吞吐量。

2. 内存池

1. 缓存池

1. 作用

内存
缓存池
磁盘

​ 内存和磁盘的读取速度有一定差距,通过增加一个缓存池,缓存一些数据来提高读取命中率,降低读取磁盘的次数,从而提高读取效率,可以有多个缓存池实例,降低资源的竞争,提高并发。

2. 算法:LRU算法,增加midpoint的LRU算法

LRU算法(least recently used,最近最少使用)
朴素LRU:维护一个列表,最经常被访问的数据放置在顶端,当列表已满,则删除列表最后的元素
改造后midpoint的LRU:维护一个列表,新读取到的页是缓存在列表的midpoint位置,midpoint前的为new表,是热点数据,midpoint后为old表,这种LRU算法能够更好地适应数据库,因为在有些操作比如使用索引时,有时需要遍历所有页,就会将真正的热点数据挤掉。
那新的数据是直接插入到midpoint位置,原有的数据往上/往下移动:链表形式插入midpoint位置

2. 缓存池列表

名词 含义
LRU List 管理已经读取到的页
Free List 数据库刚启动时,LRU list为空,数据页存放在Free List中,后续操作才从Free List中删除该页再加入LRU List中
Flush List 脏页列表;在LRU中的数据被修改了,该页就是脏页(缓存与磁盘数据不一致),但不会立即刷到磁盘,影响效率,通过checkpoint机制刷新到磁盘
page make young 将页从old部分移动到new部分叫做
buffer pool hit rate 缓冲池命中率
-- 查看命中率
select pool_id,pages_made_young,pages_not_made_young,hit_rate from innodb_buffer_pool_stats;
-- 查看状态:包括线程和缓存池
show engine innodb status;
-- Database pages:LRU列表数量
-- Free buffers :free list数量
-- Modified db pages:脏页数量

3. 脏页刷新机制:checkpoint机制

1. 脏页:在LRU中被改变的数据

2. checkpoint机制

① 将缓存池数据同步刷新到磁盘中
② 数据库宕机时,通过重做日志来恢复数据(重做日志缓存池–>通过checkpoint刷新到磁盘),不需要重做所有日志,只需要对checkpoint后的重做日志进行恢复即可。

每一次都将缓存区中被修改的数据刷新到磁盘中,太耗费性能,则用checkpoint机制

checkpoint类型 场景
sharp checkpoint 数据库关闭时,所有脏页都刷新到磁盘
fuzzy checkpoint 按照一定时间,一定比例刷新到磁盘(消耗小)

4. 关键特性

4.1 插入缓冲:insert buffer

类型 功能
insert buffer 对非聚集索引的插入进行缓存,合并后再刷出,减少对磁盘B+树的操作次数,提高性能
change buffer 是insert buffer的升级,能够对DML操作:insert ,delete,update都进行缓冲

Ibuf: size 1,:已经合并记录页的数量
free list len 3, :空闲列表长度
seg size 5,:insert buffer的大小
0 merges:合并次数
密集IO时,插入缓冲会占用过多的缓存池内存

主键:聚集索引
单个索引:非聚集索引,B+树特性决定其插入的离散性
插入缓冲只能用于非聚集索引且并不是唯一的索引这种情况,

4.2 两次写(double write):数据页可靠性

​ 后台线程将脏页刷新到磁盘时,一页的大小时 16k,但文件写入单位是 4k,不能保证一次原子性写入整个页,需要分多次,若是在写入时,出现宕机情况,有可能会导致一页数据中一部分没有写入,此时double write(维护多一个页的副本)就时用来解决这种问题。

页,16K,若是宕机,其中4K未写入
部分写失效
重做日志
对页进行物理操作,可页已经损坏
重做还原不了数据
doublewrite,保证数据页可靠性
页的副本
还原该页数据
重做日志还原数据

在内存中有一个doublewrite buffer,磁盘中有两个doublewrite,脏页不直接刷出磁盘,而是先写一次到doublewrite buffer再写一次到doublewrite,最终才刷出同步到磁盘,这样就通过两次写来提高页的可靠性。
《MySQL技术内幕:InnoDB存储引擎》2. InnoDB的体系架构_第1张图片

4.3 自适应哈希索引

哈希的查找效率是O(1),B+树的查找效率取决于数的高度,有可能达到3-4次,相对比B+树来说,哈希的效率会高,在InnoDB中,会监控各个索引页的查询,如果建立哈希索引能够提高查找速度则会建立,这就是自适应哈希索引(adaptive hash index,AHI),AHI是根据在缓存池中的B+树建立起来的,而且不是对整张表建立,只是对热点页建立哈希索引,设计思想是数据库自优化。

  • 查找效率O(1)
  • 根据缓存池中的B+树构造
  • 只对热点页构造,不是整张表
  • 只能用于搜索等值查询,模糊查询不可用

4.4 异步IO

异步IO能够提高IO利用率,一方面能merge IO,将多次IO合并到一次,减少IO次数,另一方面无需等待上一次IO结束返回才进行下一次IO

你可能感兴趣的:(MySQL)