谈谈InnoDB四大特性
Change Buffer
- 旧版Insert Buffer,只对insert生效,而Change Buffer对CUD都生效
- 只对非唯一索引生效,在写过程中,先判断数据索引页是否在缓冲池中,如果不在则加入Change Buffer,按一定的频率进行合理地合并,再写回disk中,减少IO带来的性能损耗
Double Write(页副本)
- Doublewrite缓存是位于系统表空间的存储区域,用来缓存InnoDB的数据页从innodb buffer pool中flush之后并写入到数据文件之前,所以当操作系统或者数据库进程在数据页写磁盘的过程中崩溃,Innodb可以在doublewrite缓冲找到数据页的备份而用来执行crash恢复。
- 数据页写入doublewrite缓存的动作所需要的IO消耗要小于写入线文件的消耗,因为此写入操作会以一次大的连续块的方式写入。
- 在应用(apply)重做日志前,用户需要一个页的当写入失效发生时,先通过页的副本来还原该页,再进行做,这就是double write.(redo log无法恢复数据页损坏的问题,恢复必须是数据页正常并且redo log正常。)
- 因为存储引擎缓冲池内的数据页大小默认为16KB,而文件系统一页大小为4KB,所以在进行刷盘操作时,就有可能发生数据库准备刷新脏页时,需要四次IO才能将16KB的数据页刷入磁盘,但是数据库发生意外宕机,导致此时才刷了2个文件系统里的页,这种情况被称为写失效(partial page write),此时重启后,磁盘上就是不完整的数据页,就算使用redo log也是无法进行恢复的。
- 在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先复制到内存中的Double write buffer
- 通过Double write buffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题
自适应Hash索引
- 针对二级索引
- 通过监控频繁查询的数据(连续3次),生成hash索引以此来加快数据的查询速度
预读
- 线性预读
- 以extent为单位,将下一个顺序可能读到的数据提前读入缓存
- 随机预读
- 以page为单位,着眼于将当前extent中剩余的page提前读入缓存(Buffer Pool)
谈谈InnoDB四大特性
http://lzhnet.top/2023/07/03/谈谈InnoDB四大特性/