InnoDB关键特性

上一篇中我们简单了解了InnoDB的体系结构,了解它主要包含一个内存池以及一些后台进程。内存池主要包括缓冲池、日志缓冲池以及额外缓冲池三大块,其中缓冲池中又包含数据和索引页的缓存、插入缓冲、自适应哈希索引缓冲、锁信息缓存以及数据字典缓存等。后台进程中最主要的就是master thread进程,它基本包含了大部分的功能,其中包含几大循环,重点是主循环,主要分为每秒的操作和每10秒的操作。详细内容可回顾 InnoDB体系结构 这篇文章。
这篇文章我们再学习一下InnoDB中的几个关键特性:

  • 插入缓冲(insert buffer)
  • 两次写(double write)
  • 自适应哈希索引(adaptive hash index)

插入缓冲(insert buffer)

首先我们来了解一下为什么有插入缓冲这个功能。InnoDB中有两种,称为聚集索引和非聚集索引。聚集索引就是索引结构和数据存在一起,非聚集索引是索引结构和数据分开存储。如果一个表的主键同时是自增列,那么数据本身按照递增的方式写入,表中的数据本来就是顺序存储的,这种表也称为聚集索引。而在表上其他的普通字段上创建的普通索引就是非聚集索引。
对于聚集索引来说,插入操作本身就是顺序写,一般很快就能完成。而对于非聚集索引来说,写入时是离散地访问非聚集索引页,所以性能相对变低。这个其实是因为B+树的存储结构造成的。
为了提升非聚集索引带来的写入性能慢,InnoDB在缓冲池中增加了一个插入缓冲,对于非聚集索引的插入或更新操作,不是每一次直接插入索引页,而是先判断插入的非聚集索引页是否在缓冲池中。如果在,则直接插入;如果不在,则先放入一个插入缓冲区中,然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作,这时通常能将多个插入合并到一个操作中,从而提高了对非聚集索引执行插入和修改操作的性能。
插入缓冲的使用要满足2个条件:

  • 索引是辅助索引。-即不是主索引。
  • 索引不是唯一的。-因为插入到插入缓冲时不会去查询索引页的情况。

不过插入缓冲也有一个缺点,就是如果在有大量插入更新操作的场景中,缓冲池中有大量的插入缓冲没有合并到非聚集索引,此时如果数据库发生宕机,那么宕机后由于要进行合并操作恢复时间可能会更长

插入缓冲的使用情况可以通过show engine innodb status命令查看。
插入缓冲存在的另一个问题是在写密集情况下,插入缓冲会占用过多的缓冲池内存,默认情况下最大可以占一半的缓冲池内存。不过现在的版本中可以通过修改IBUF_POOL_SIZE_PER_MAX_SIZE来修改插入缓冲能占用的最大内存比。

两次写(double write)

两次写的功能是为了解决宕机时可能导致的数据丢失问题。在没有两次写的情况下,数据库宕机时,如果数据库正在写一个页而且只写了一部分(比如16K的页只写了前4K),那么就会发生部分写失效,但是这种写失效是没有办法完全靠重做日志进行恢复的,因为重做日志记录的是对页的物理操作,如偏移量800写’aaa’记录。因此如果页本身损坏的话对其重做就没有意义了。所以在应用重做日志前我们需要一个页的副本,当写入失效发生时,先通过页的副本还原该页,再进行重做,这就是double write
double write由两部分组成:一部分是内存中的doublewrite buffer,大小为2MB;另一个部分是磁盘上共享表空间中连续的128个页,即两个区(extent),同样为2MB。当缓冲池的脏页刷新时,并不直接写磁盘,而是通过memcpy函数将脏页先copy到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次每次写入1MB到共享表空间的物理磁盘上,然后马上调用fsync函数同步磁盘,避免缓冲写带来的问题。
如果系统在将页写入磁盘的过程中宕机,在恢复过程中,InnoDB可以从共享表空间中的doublewrite中找到该页的一个副本,将其拷贝到表空间文件,再应用重做日志
在这里插入图片描述

可以通过参数skip_innodb_doublewrite禁止使用double write功能,不过可能会带来写失效的问题,在需要提供数据高可靠性的主服务器上建议确保开启两次写功能。

自适应哈希索引(adaptive hash index)

Oracle及SQL Server等数据库不支持哈希索引,InnoDB默认的索引类型为哈希索引。InnoDB会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,所以InnoDB中的索引也称为自适应哈希索引。自适应哈希索引通过缓冲池的B+树构造而来,因此建立速度很快。不需要整个表都建哈希索引,InnoDB引擎会自动根据访问的频率和模式来为某些页建立哈希索引。启用自适应哈希索引后,读写速度可以提高2倍多。可以通过show engine innodb status来查看自适应哈希索引使用情况。
哈希索引只能用来搜索等值的查询,可以通过参数innodb_adaptive_hash_index来禁用或启动此特性,默认为开启。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值