【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 操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1999

每人一点点,明天会更好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值