十. MySQL InnoDB 三大特性之 双写缓冲区 与 自适应Hash索引

目录

  • 一. 双写缓冲区 double write buffer
  • 三. 自适应hash索引(AHI)

一. 双写缓冲区 double write buffer

  1. 索引页是怎么管理的,MySQL中提出了系统表空间(针对MySQL服务本身的)与独立表空间(针对自定义表数据的),每个表对应一个"表名.ibd"文件,这个文件就可以认为是当前表的独立表空间,用来管理索引页
  2. 在系统表空间中存在几个特殊的页(不是重点)
  1. SYS Insert Buffer Header 存储Insert Buffer的头部信息
  2. INDEX Insert Buffer Root 存储Insert Buffer的根页面
  3. TRX_SYS Transction System 事务系统的相关信息
  4. SYS First Rollback Segment 第一个回滚段的页面
  5. SYS Data Dictionary Header 数据字典头部信息
  1. 系统表空间中的特殊的页存在0分区中,重点是分区的1区,2区,这两个区有个特殊的名字"double write buffer"双写缓冲区一共2m(64个页组成一个分区大概1M),重点: 双写缓冲区是持久化到磁盘的系统表空间中的两个区
  2. MySQL在写数据时,实际数据是先到达这个双写缓冲区的,然后由双写缓冲区将数据flush刷出到磁盘,为什么:
  1. MySQL使用InnoDB是操作数据是以页为单位默认16kb进行的,而系统与磁盘间的数据操作是以4kb为单位进行的,就会出现一个问题,上层的一次写操作,对应到磁盘可能需要执行多次,极端情况下(比如断电,系统崩溃)时,刚写入了4K或8K数据,不能保证该操作的原子性,出现部分页面写问题
  2. 当发生极端情况时,可以从系统表空间的Double Write Buffer双写缓冲区进行恢复
  1. MySQL写操作与双写缓冲区使用原理:
  1. 在执行写操作时MySQL实际会写两份,一份通过顺序写写到双写缓冲区,一份随机写写到磁盘也就是数据的实际落盘
  2. 通过fsync多写一次数据到双写缓冲区,虽然顺序写大概还是会造成5%-10%的性能消耗,但是能保证数据的安全
  3. 数据写入双写缓冲区成功,真实落盘失败时,会通过双写缓冲区拿到写入的数据重新落盘
  4. 数据写入双写缓冲区如果失败,MySQL会通过B+树载入原始数据,通过redoLog恢复原始数据
  1. 当写入失败时为什么不直接通过redoLog恢复原始数据,而要引入双写缓冲区,通过双写缓冲区+redoLog一块去恢复:

redoLog中记录的是页的修改记录,如果通过readLog进行恢复比较慢,在使用双写缓冲区后如果掉电,直接拷贝双写缓冲区的即可,readLog慢的原因后续参考事物

三. 自适应hash索引(AHI)

  1. Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,这个二级索引建立对应的哈希索引提高性能(这个hash索引时存在BufferPool的)
  2. hash索引的特点
  1. 无序,没有树高
  2. 降低对二级索引树的频繁访问资源, 索引树高<=4,访问索引:访问树、根节点、叶子节点
  3. 自适应
  1. 缺点
  1. hash自适应索引会占用innodb buffer pool
  2. 自适应hash索引只适合搜索等值的查询,如select * from table where index_col=‘xxx’,而对于其他查找类型,如范围查找,是不能使用的;
  3. 极端情况下,自适应hash索引才有比较大的意义,可以降低逻辑读。

你可能感兴趣的:(mysql,mysql,哈希算法,数据库)