三大特性--insert buffer

大哥大姐们有没有人讲详细点的我想问下,三大特性--insert buffer
最新回答
梦里七彩虹

2026-04-15 14:06:45

聚簇索引与非聚簇索引的关键区别在于数据存储方式。聚簇索引的叶子节点直接存储实际数据,且按照物理顺序排列;而非聚簇索引的叶子节点则存储的是主键地址,按照逻辑顺序进行存储。尽管传统认知上认为聚簇索引是物理连续的,但实际情况并非如此,而是逻辑上连续的。这样设计是为了提供高效的数据访问路径。



在高并发情况下,使用insert操作时,主键递增的顺序插入会使得聚簇索引的性能极佳,因为这种方式无需进行随机磁盘读取,速度快。然而,如果存在多个非唯一索引,如在主键基础上的`name`字段,插入性能会受到影响。非聚集索引的插入不再是顺序的,需要离散地访问非聚集索引页,导致性能降低。这并非因为索引设计错误,而是B+树的特性决定的。



为了解决插入操作带来的性能问题,innodb引入了change buffer,即insert buffer的升级版。这个功能能够对INSERT/DELETE/UPDATE操作进行缓冲。具体实现步骤如下:



  • 将辅助索引插入到特定的页(space,offset)。

  • 检查该页是否存在于缓冲池中。若在缓冲池中,则直接插入;若不在,则继续操作。

  • 缓存数据进入insert buffer。

  • 构造一个search key。

  • 查询insert buffer树。

  • 生成逻辑记录并插入树中。



在MySQL 4.1版本之后,insert buffer通过全局唯一的B+树进行管理,该树存储在共享表空间中,格式为ibdata1。这意味着,如果通过独立表空间的ibd文件恢复表中数据,可能会导致CHECK TABLE失败,因为辅助索引中的数据可能仍在insert buffer中。在使用ibd文件恢复后,还需要进行REPAIR TABLE操作来重建表上所有的辅助索引。



insert buffer中的B+树非叶子节点存储查询的search key(键值),而叶子节点则包含额外的metadata和secondary index record数据。为了确保在合并insert buffer时,辅助索引页能够正确合并,引入了Insert Buffer Bitmap页。这个页追踪每个辅助索引页的可用空间,确保合并操作的顺利进行。当检测到可用空间不足时,会进行合并操作,将insert buffer和待插入数据一同写入辅助索引页。



插入缓冲的使用需要满足以下条件:索引为辅助索引且索引不唯一。这是因为它旨在解决二级索引的离散插入问题,通过创建缓冲区合并数据,使用一次大IO操作统一写入磁盘。如果索引唯一,这种方法将失去意义,并增加额外的IO操作。



插入缓冲带来的性能影响主要包括两个方面:首先,数据库宕机后实例恢复时间可能会延长,特别是在执行大量插入和更新操作,且涉及非唯一聚簇索引的情况下。如果内存中的insert buffer数据未能合并至索引页中,恢复时间将变长。其次,在写密集型场景中,插入缓冲会占用大量缓冲池内存,最大可占到1/2,默认情况下,这在实际应用中可能造成内存管理问题。