mysql进阶笔记 InnoDB (一)InnoDB存储引擎

文章目录

  • mysql进阶笔记 InnoDB (一)InnoDB存储引擎
      • InnoDB体系架构
          • 后台线程
          • 内存
      • Checkpoint技术
      • Master Thread工作方式
      • InnoDB关键特性
          • 插入缓冲(Insert Buffer)
          • 两次写(Double Write)
          • 自适应哈希索引(Adaptive Hash Index)异步IO(Async IO)刷新邻接页(Flush Neighbor Page)

mysql进阶笔记 InnoDB (一)InnoDB存储引擎

InnoDB体系架构

mysql进阶笔记 InnoDB (一)InnoDB存储引擎_第1张图片
1.内存池:维护进程/线程访问的数据结构 缓存磁盘文件 重做日志缓冲
2.后台线程:保证内存缓存的是最新的数据 刷新到磁盘文件 保证能恢复正常

后台线程

1.Master Thread: 将缓冲池数据刷新到磁盘等等。
2.IO Thread: 负责异步IO请求的回调(call back)处理 。
3.Purge Thread: 回收已经使用并分配的undo页。
4.Page Cleaner Thread:脏页刷新。

内存

1.缓冲池
mysql进阶笔记 InnoDB (一)InnoDB存储引擎_第2张图片

2.LRU List、Free List和Flush List
采用改进的LRU算法进行内存管理,即将最频繁的页放到缓存列表的中间位置
3.重做日志缓冲
InnoDB存储引擎首先将重做日志信息先放入到这个缓冲区,然后按一定频率将其刷新到重做日志文件。

Checkpoint技术

当事务提交时,先写重做日志,再修改页。当由于发生宕机而导致数据丢失时,通过重做日志来完成数据的恢复。
要解决的问题:
1.缩短数据库的恢复时间 -> 数据库只需对Checkpoint后的重做日志进行恢复。
2.缓冲池不够用时,将脏页刷新到磁盘 -> 缓冲池不够用时,根据LRU算法会溢出最近最少使用的页
3.重做日志不可用时,刷新脏页 ->

分类:
1.Sharp Checkpoint: 数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作方式
2.Fuzzy Checkpoint: 只刷新一部分脏页,而不是刷新所有的脏页回磁盘。

Master Thread工作方式

InnoDB关键特性

插入缓冲(Insert Buffer)
  1. insert buffer
    插入缓存是存储在磁盘中的。
    问题:在进行索引的插入时,对于聚集索引来说插入操作是按主键进行顺序插入的,所以不需要用到磁盘的随机读取;但是对于辅助索引来说,插入操作不再是顺序插入了,所以耗时较长。
    InnoDB解决方法:InnoDB存储引擎开创性地设计了Insert Buffer,对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个Insert Buffer对象中,然后再以一定的频率和情况进行Insert Buffer和辅助索引页子节点的merge(合并)操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对于非聚集索引插入的性能。
    需要满足条件:a.索引是辅助索引 -> 聚集索引不需要此操作
    b.索引是唯一的 -> 判断唯一性也需要用随机读取
    2.change buffer
    InnoDB 1.0.x版本开始引入
    支持对insert、delete、update都进行缓冲。

3.内部实现
Insert Buffer是一棵B+树,因此其也由叶节点和非叶节点组成。非叶节点存放的是查询的search key(键值)

两次写(Double Write)

oublewrite(两次写)为InnoDB存储引擎提供数据页的可靠性。
doublewrite由两部分组成,一部分是内存中的doublewrite buffer,大小为2MB,另一部分是物理磁盘上共享表空间中连续的128个页,即2个区(extent),大小同样为2MB。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先复制到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题。在这个过程中,因为doublewrite页是连续的,因此这个过程是顺序写的,开销并不是很大。在完成doublewrite页的写入后,再将doublewrite buffer中的页写入各个表空间文件中,此时的写入则是离散的。

自适应哈希索引(Adaptive Hash Index)异步IO(Async IO)刷新邻接页(Flush Neighbor Page)
  1. InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。
  2. 用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,这就是AIO。
  3. 当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。这样做的好处显而易见,通过AIO可以将多个IO写入操作合并为一个IO操作,故该工作机制在传统机械磁盘下有着显著的优势。

你可能感兴趣的:(开发相关技术,后端,mysql,数据库)