• 【Mysql高级特性】 InnoDB 的关键特性


    相关文章地址
    初探 InnoDB 体系架构 初探 InnoDB 体系架构
    InnoDB Checkpoint与 Redo logInnoDB Checkpoint与 Redo log

    💓 InnoDB 的关键特性

    InnoDB 存储引擎关键特性包括:

    • 插入缓冲 (insert Buffer)
    • 两次写 (Double Whrite)
    • 自适应哈希索引 (Adaptice Hash Index)
    • 异步IO (Async IO)
    • 刷新邻接页 (Flush Neighbor Page)

    💓插入缓冲 (insert Buffer)


    在 InnoDB 存储引擎中,主键时行唯一的标识符。通常应用程序中行记录的插入顺序按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,但是不可能在每张表上只有一个聚集索引,大多数,一张表上有多个非聚集的辅助索引。这种情况下产生了一个非聚集的列不是唯一的索引。在进行插入操作时,对于非聚集索引叶子节点的插入不再是顺序的,这是需要离散式访问非聚集索引页,由于搜集读取存在而导致插入的操作性能下降。
    ** 对于非聚集索引插入和更新操作,不是每一次一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个 insert Buffer 对象中,然后在以一定的频率和情况进行 insert Buffer 和辅助索引叶子节点 merge 操作,通常能将多个插入合并到一个操作中,从而提高了对于非聚集索引插入的性能。
    InnoDB 缓冲池确实包含了Insert Buffer的信息,但Insert Buffer 和数据页一样,也是物理存在的(以B+树的形式存在共享表空间中)。
    使用 insert Buffer 的条件:

    • 索引是辅助索引 : 主键是唯一索引
    • 索引不是唯一的 : 如果索引是唯一的,需要对索引的唯一性进行判断,那么就避免不了查找索引页。

    insert Buffer存在的问题,在密集写的情况加,插入缓存占用过多的缓冲池内存,默认可以最大占用1/2的缓冲池内存。
    如果数据库宕机,必有大量的 insert Buffer 并没有合并到实际的非聚集索引中,因此恢复需要很长的时间

    💓 change Buffer

    InnoDB 从1.0.x版本引入了 changge Buffer ,可将其视为 Insert Buffer 的升级,增加了对 insert、 delete、 update都进行了缓冲,change Buffer适用的对象依然是 非唯一的辅助索引

    • insert buffer : 先写 insert buffer 之后再 merge到辅助索引的叶子节点
    • detete buffer : 先将记录标记为已删除,
    • purge buffer : 真正将记录删除

    insert 对应 insert buffer
    update 和 delete 对应 detete buffer 和 purge buffer 因为这里只是对索引树和索引列的维护操作,对于一个索引值没有更新操作只有删除

    💓 insert Buffer 数据结构

    insert Buffer 的数据结构是一颗B+树,在 mysql 4.1之后 insert Buffer 由一颗B+数构成。负责对所有表的辅助索引进行 insert Buffer 。 这个B+树存放在共享表了空间中。

    💓 Merge insert Buffer

    Merge insert Buffer 就是将 Insert Buffer 中的记录合并到真正的辅助索引中
    在下面几种情况下发生

    • 辅助索引页呗读取到缓冲池中
      当辅助索引页呗读取到缓冲池中时,如果辅助所有也又记录存在于 insert Buffer B+书中,则将该页的记录插入到该辅助索引页中
    • Insert Buffer Bitmap 页追踪到该辅助索引页一无可用空间时
      若插入辅助索引记录时检测到插入记录后可用空间会小于1/32页,则会强制进行一个合并操作
    • Master Thread 刷新
      每秒或者每10秒进行一次 Merge insert Buffer 操作

    💓两次写 (Double Write)

    insert Buffer 带给 InnoDB 存储引擎时性能上的提升, 那么 doublewrite 带给 InnoDB 的时数据也的可靠性。
    数据库放生宕机时,可能innoDB 存储引擎正在是写入某个页到表中,而这个页写了一部分,比如16KB的页 ,只写了前 4 KB ,之后就发生了宕机,这种情况被称为部分写失效 (partial page write)。 重做日志中记录的时对页的物理操作。如果这个页本身已经发生了损坏,在对其重做时没有意义的。
    Double Write: 在应用重做日志之前,用户需要一个页得副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做。

    💓Double Write 组成

    在这里插入图片描述

    • doublewrite buffer 大小为 2MB 内存
    • 共享表空间 大小为 2MB 磁盘
      在对缓冲池进行刷新时,并不直接写磁盘,而是会员通过memcpy函数将脏页先复制到内存中的 doublewrite buffer,之后通过 doublewrite buffer 再分两次,每次1MB 顺序低写入共享表空间的物理磁盘上,然后马上调用fsync 函数,同步输盘,避免缓冲来的问题

    💓自适应哈希索引 (Adaptive Hash Index,AHI)

    哈希查找的一般情况下的时间复杂度为 0(1),而 B+ 树的查找次数,取决于B+树的高度,在生产环境B+树的高度一般为3到4层,需要3到4此查询。

    自适应哈希索引 : InnoDB 存储引擎会监控对表上各索引页的查询。如果观察到简历哈希索引可以带来速度提升,则建立哈希索引

    AHI 是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表结构建立哈希索引。

    在启用 AHI 后,读取和写入的速度可以提升2呗,辅助索引的连接操作性能可以提高5倍。

    AHI 构成的条件

    • 对一个页的连续访问模式必须是一致的,也就是查询条件必须是一致的
    • 以同一种查询条件进行了100次以上的访问

    💓异步IO (Async IO)

    为了提高磁盘操作性能,当前的数据库系统都采用异步 io 的方式来处理磁盘操作。

    异步IO 的优势:

    1. 如果用户发出的是一条索引三秒的查询,那么这条SQL 查询语句可能需要扫描多个索引页,也就是要进行多次IO 操作。用户可以在发出一个 IO 请求后立即再发出两一个IO 请求,当全部IO 请求发送完毕后,等待所有IO 操作的完成。
    2. 可以进行IO Merge 操作,将多个IO 合并成一个 IO。
      例如需要访问页 (8,6) (8,7) (8,8) ,就会进行 IO merge 操作 合并成 (8,6)的访问

    💓刷新邻接页 (Flush Neighbor Page)

    刷新邻接页:当刷新一个脏页时,InnoDB 存储引擎会检测该页所在区的所有也,如果时脏页,那么一起进行刷新通过 AIO 可以将多个IO 写入操作合并为一个 IO 操作。

  • 相关阅读:
    采空区沉降监测系统解决方案
    【JAVA】有关包的概念
    【数据科学赛】2023年亚太眼科学会大数据竞赛 #$15000 #阿里天池 #分类
    mysql核心知识之视图的应用
    gpio内部结构(一)
    图解快速排序算法
    2022.7.2 Linux——网络相关知识
    文本分析总结
    利用大模型反馈故障的解决方案
    echarts一些配置项的使用
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126770813