type
status
date
slug
summary
tags
category
icon
password
🌱
除非需要用到某些 InnoDB 不具备的特性,并且没有其他办法可以替代,否则都应该选择 InnoDB 引擎
notion image
notion image

Buffer Pool(缓冲池 )

  • 用于加速数据的访问和修改,通过将热点数据缓存在内存的方法,最大限度地减少磁盘 IO,加速热点数据读写
    • 默认大小为128M,Buffer Pool 中数据以页为存储单位,其实现的数据结构是以页为单位的单链表;
    • 由于内存的空间限制,Buffer Pool 仅能容纳最热点的数据;
    • Buffer Pool 使用LRU算法(Least Recently Used 最近最少使用)淘汰非热点数据页;
    • 对于 Buffer Pool 中数据的查询,InnoDB 直接读取返回;
    • 对于 Buffer Pool 中数据的修改,InnoDB 直接在 Buffer Pool 中修改,并将修改写入 redo Log 中,当数据页被 LRU 算法淘汰时写入磁盘,若持久化前系统崩溃,则在重启后使用 redo Log 进行恢复。

Change Buffer(修改缓冲)

  • 用于加速非热点数据二级索引的写入操作
    • 二级索引就是辅助索引,除了聚簇索引之外的所有索引都是二级索引, 聚簇索引也叫聚集索引,索引组织表,指的是一种数据存储方式,指数据与索引的数据结构存储在 一起。如 InnoDB 的主键索引中所有叶子节点都存储了对应行的数据。因为数据肯定只是存储在 一个地方,所以一个表只能有一个聚集索引
    • 由于二级索引数据的不连续性,导致修改二级索引时需要进行频繁的磁盘 IO 消耗大量性能,Change Buffer 缓冲对二级索引的修改操作,同时将写操作录入 redo log 中,在缓冲到一定量或系统较空闲时进行 merge 操作将修改写入磁盘中。 Change Buffer 在系统表空间中有相应的持久化区域;
    • Change Buffer 大小默认占 Buffer Pool 的 25%,最大50%,在引擎启动时便初始化完成。其物理结构 为一棵名为 ibuf B Tree;
    • 周期性合并二级索引页;
    • 周期性净化磁盘中二级索引页。

Adaptive Hash Index(自适应索引)

  • 用于实现对于热数据页的一次查询
    • 是建立在索引之上的索引;
    • 使用聚簇索引进行数据页定位的时候需要根据索引树的高度从根节点走到叶子节点,通常需要 3 到 4 次查询才能定位到数据。InnoDB 根据对索引使用情况的分析和索引字段的分析,通过自调优 Self-tuning 的方式为索引页建立或者删除哈希索引;
    • AHI 的大小为 Buffer Pool 的 1/64,在 MySql 5.7 之后支持分区,以减少对于全局 AHI 锁的竞争,默认分区数为 8;
    • 对于二级索引,若命中 AHI,则将直接从 AHI 获取二级索引页的记录指针,再根据主键沿着聚簇索引查找数据;若聚簇索引查询同样命中 AHI,则直接返回目标数据页的记录指针,此时就可以根据记录指针直接定位数据页。
 
 
notion image
 

Log Buffer

  • 用于缓冲日志文件的写入操作
    • 内存写入加上日志文件顺序写的特点,使得 InnoDB 日志写入性能极高;
    • 对于任何修改操作,都将录入诸如 redo log 与 undo log 这样的日志文件中,因此日志文件的写入操作 非常频繁,却又十分零散。这些文件都存储在磁盘中,因此日志记录将引发大量的磁盘 IO。Log Buffer 将分散的写入操作放在内存中,通过定期批量写入磁盘的方式提高日志写入效率和减少磁盘 IO。 注意:这种将分散操作改为批量操作的优化方式将增加数据丢失的风险!
    •  
 
 
notion image
 
上一篇
一条SQL语句的完整执行流程
下一篇
InnoDB - 磁盘结构