本文将简单介绍mysql innodb存储引擎的关键特性;
以帮助大家对innodb以及数据库底层的特效有大致的了解并学习其中的设计,方便后续做更深的学习和问题分析;
下面参考《mysql技术内幕 InnoDB存储引擎》,分享innodb引擎的关键特性:
插入缓冲
- innodb基于聚簇索引的时候插入是顺序的,不需要磁盘的随机读写,但是对于非聚簇索引插入不再是顺序的来,性能会下降;
- 对于非聚簇索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断是否再缓冲池种,在,直接插入,不在,先放到insert buffer中,然后根据情况按一定的频率进行buffer和辅助叶子节点的merge操作,就将多个插入合并到一个操作中,可以相应提升性能;
- 使用条件:索引是辅助索引, 不是唯一索引;
- Insert Buffer数据结构是一颗b+树,负责所有辅助索引的插入缓存,存放在共享表空间;
- 当发现辅助索引页空间不大时,以及Master 进程定期会进行merge Insert Buffer,将其merge仅进物理内存;
两次写
- doublewrite两部分组成,内存中的buffer以及物理磁盘上的共享表空间的2MB空间;
- 对缓冲池的脏页刷新时,会先copy到内存中的doublewrite buffer,然后分两次写入磁盘上,然后调用fsync同步磁盘;
- 当写入失效时(如宕机引起),先通过页的副本还原页,然后通过冲入日志重做,就是doublewrite;
- doublewrite带给存储引擎数据也的可靠性;
自适应哈希
- 存储引擎对访问的热点数据构建自适应哈希,提高速度;
- 自适应哈希索引是通过缓冲池的B+树页构造而来,建立速度快;
- 要求:对某个页的连续访问模式是一样的;
异步IO
- 异步IO可以进行IOmerge, 提升性能;
刷新邻接页
- 当刷新一个脏页时,检测所在区的所有也,如果是脏页,也一起刷新;
备注
- 以上是对innodb存储引擎关键特性的一些介绍,大部分特效都是可以通过配置进行开关的,可以结合实际情况进行调整;
- 如两次写,如果我们有其他高效的写失效防范机制,也可以考虑不适用这个特性;
- 像异步的这些思想在我们的程序设计中都可以进行参考;
- 同意像刷新邻接页的特性,我们在进行概率抽样处理的时候,也可以参考这个思想扩大抽样范围;
以上是对innodb关键特效的简单介绍,后续会继续进行相关简单和进阶知识的分享,欢迎一起讨论交流~