当前位置: 首页 > 工具软件 > InnoDB > 使用案例 >

InnoDB 四大特性

乐修远
2023-12-01

InnoDB 四大特性如下:

  1. 插入缓存,Insert buffer
  2. 二次写,double write
  3. 自适应哈希索引,adaptive hash index
  4. 预读,read ahead

插入缓存

索引数据存储在磁盘上,主键索引由于天然自增,无须磁盘的随机 I/O,只需不断追加即可。但普通索引大概率无序,默认情况下需要进行随机磁盘 I/O 操作,效率极差

为了解决普通索引插入效率低下的问题,InnoDB 存储引擎引入 Insert Buffer 的概念,对于普通索引(非聚集索引)不是直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓存池中,如果在直接插入,否则先放入 Insert buffer 对象中,然后以一定频率和辅助索引页子节点进行合并操作,此时通常能将多个插入合并到一个操作中,提高插入性能

使用前提:

  1. 普通索引(非聚簇索引)
  2. 索引不唯一

这里索引不唯一是因为如果要保证唯一,每次操作还得去判断当前索引值是否已存在,而判断又涉及到磁盘随机 I/O,从而发挥不出插入缓存的优势


二次写

InnoDB 索引页一般 16KB 大小,而操作系统写文件以 4KB 为单位,这就导致同一页需要分四块分别写入。此时就存在写完一块系统崩溃或者断电等特殊情况,此时就导致写入数据不完整的问题

二次写就是为了解决该问题,double write 分为两部分,一部分 doublewrite buffer,其大小 2MB,另一部分是磁盘上共享表空间中连续的 128 个页,也是 2,B

每次刷盘时这样处理:先将脏数据写入 doublewrite buffer,doublewrite buffer 每次 1MB 写入共享表空间的磁盘上,完成以上两步后调用 fsync 函数,将数据同步到各个表空间

如果操作系统在将页写入磁盘的过程中崩溃,InnoDB 重启发现页数据损坏后,可以从共享表的 doublewrite 中找到副本,用于数据恢复


自适应哈希索引

InnoDB 虽然主要使用 B+ 树作为索引结构,但在某些特殊场景下用到哈希索引。InnoDB 会监控对表上索引的查找,如果发现某个索引频繁被访问,则建立哈希索引。InnoDB 会自动根据访问的频率和模式来为某些页建立哈希索引


预读

当 InnoDB 预计某些页很快就要被访问时,会异步加载对应页数据到缓冲池。该思路就类似空间局部性:如果某块内存被访问,那么它周围的内存大概率也会被访问。

InnoDB 采用两种预读算法提高 I/O 性能:线性预读 和 随机预读

  • 线性预读:以块为单位,一块等于64页。如果某一块中的被顺序读取的页数超过预定值,则 InnoDB 将会异步的将下一块读取到 buffer pool 中

  • 随机预读:以页为单位,当某一个块中的一些页在 buffer pool 中被发现时,InnoDB 会将该块中的剩余页一并读到 buffer pool 中,目前已废弃

 类似资料: