在InnoDB,索引页面结构插入缓冲,自适应哈希索引
InnoDB索引的物理结构InnoDB索引B树的所有指标,以及指标的记录保存在叶、和默认的索引页面大小为16K。当一个新的记录插入,InnoDB会试图离开的1 / 16的免费页面大小在考虑今后的插入和更新操作。
如果索引记录按索引大小顺序插入,索引也将填充整个页面大小15 16。如果插入序列是完全随机的,网站首页基本上是由1 / 2至15 / 16.if填充因子小于1 / 2,InnoDB会尝试重建树。
mysql5.6后,您可以设置每个索引页面的大小在当前实例的innodb_page_size参数,一旦设置,它是不可改变的回来。推荐配置一般是16K,8K或4K。此外,如果一个MySQL实例设置一个不同于默认值innodb_page_size,它不会能够使用其他不同价值的文件,如物理备份和恢复。
插入缓冲
数据库应用程序通常插在主键序列中。在这种情况下,由于聚集索引的顺序与主键值的顺序完全相同,插入操作将减少大量随机IO。
另一方面,二级索引通常不是唯一的,因此在两级索引中插入数据是相对随机的顺序,同样的,删除和更新操作在索引数据页时涉及索引的变化,而不是在两级索引旁边,这导致大量随机IO。
当一个记录被插入,或记录从非独特的两级索引删除,InnoDB会先检查是否两级索引页面在缓冲池。如果缓冲池中的缓冲池,InnoDB将修改索引页面直接在内存中,如果指数不在InnoDB缓冲池,将记录这一变化对插入缓冲区,即insertbuffer。插入缓冲区通常是比较小的,所以可以保证是所有在缓冲池和更新非常频繁,修改的过程是变化的缓冲(通常,它只作用于插入操作,因此也被称为insertbuffering,和数据结构插入缓冲)。
用于刷新插入缓冲区的磁盘I/O
那么插入缓冲区是如何减少随机IO的呢每一次,插入缓冲区将与两级非唯一索引在insertbuffer合并。通常,它融合了N到相同的B树索引相同的索引页面的变化,从而节约了大量的IO操作,经过测试,insertbuffer可提高15倍的插入速度。
在提交事务,插入缓冲区仍可能被合并到写。所以,如果DB异常重启,恢复阶段,当有许多两级索引需要更新或插入,插入缓冲需要很长的时间,甚至几个小时。在这个阶段,将磁盘IO增加,然后磁盘绑定类型的查询将有一个显着的性能下降。
自适应哈希索引
自适应哈希索引(AHI)使InnoDB缓冲池下有足够的记忆和一些工作量。它看起来更像一个内存数据库,而不牺牲任何交易的稳定性的特点。这一特点是由innodb_adaptive_hash_index控制参数。默认情况下是动态参数。它意味着开放的自适应哈希索引。经过散列AHI、内置的哈希表将立即清空,而正常操作可以继续进行,只有通过直接访问B树索引的哈希表。再后AHI可以重建。
通过观察搜索元素模式,MySQL将使用索引键的前缀来构建哈希索引。前缀可以是任意长度,它可能只在树的一些价值观,而不是整个b-tree.the哈希索引会在经常访问的页面测试指标建立哈希索引。
如果几乎每个表中的缓冲池,一个哈希索引可以加快查询的等价和B树索引值转化为一个指针。InnoDB必须监控指标的搜索情况的机制。如果发现有些查询可以通过构造散列索引来优化查询,它将自动建立,因此它是自适应的。
在一定的工作量,性能的提高值的哈希索引查找带来比附加索引和哈希表结构大得多。但在某些情况下,高负荷,读写锁添加到自适应哈希索引也带来了竞争,如高并发连接操作。操作和%通配符不适用于AHI为好。如果工作量不适合AHI,建议以免带来不必要的性能开销接近它。因为它是MySQL的预测是否在特定情况下是合适的呼吸非常困难,建议做一个实际的工作量负荷试验(有AHI两例)。在5.6及以后的版本中,我们将考虑工作量越来越多,W最好是删除禁用自适应哈希索引,尽管默认情况下它仍然是打开的。
哈希索引的建立往往是基于现有的树。我们可以通过观察树和建筑的B树索引前缀长度任意搜索情况建立哈希索引,Hash索引只能是局部的,只包括最频繁的B树索引访问的页面。
你可以决定是否要通过观察显示引擎INNODB STATUS结果信号部分采用自适应哈希索引。如果你看到很多的线程创建RW锁在btr0sea。C文件,然后建议关闭自适应哈希索引。我遇到一个案例截图如下,一个典型的高并发模式造成的AHI的竞争,需要关闭AHI
以上是关于InnoDB的索引页面结构,插入缓冲和自适应哈希索引,即萧边分享你的全部内容。我希望能给你一个参考,希望你能支持它。