在2.6.1里的第4点,Merge Insert Buffer
其中描述发生 Merge的情况有三种
- 辅助索引页被读取到缓冲池中
- Insert Buffer Bitmap 页追踪到该辅助索引页已无可用空间时
- Master Thread
第二种情况,书中原话
Insert Buffer Bitmap 页用来追踪每个辅助索引页的可用空间,并至少有1/32页的空间。若插入辅助索引记录时检测到插入记录后可用空间小于1/32页,则会强制进行一个合并操作,即强制读取辅助索引页,将insert Buffer B+树中该页的记录及待插入的记录插入到辅助索引页中。也就是上述所说的第二种情况。
内容中辅助索引页出现了三次,
- 第一次作为Insert Buffer Bitmap追踪的对象
- 第二次作为被读取的对象
- 第三次作为被插入的对象
首先来说,书中在本小节之前有介绍过Insert Buffer Bitmap是用来记录辅助索引页的信息,保证merge操作的成功,主要就是记录辅助索引页中的空间。这个辅助索引页存在哪里那部分的辅助索引页,第一辅助索引页可能会出现在Insert Buffer的B+树中,第二在磁盘中也有辅助索引页,根据对Insert Buffer Bitmap的作用描述,保证merge的成功,而merge操作是将insert buffer 中的记录插入到 磁盘中的辅助索引页中,要保证这个操作成功就是要确保磁盘中的辅助索引页要有空间,Insert Buffer Bitmap记录的对象就是在磁盘中的辅助索引页。因为书中没有说明这个辅助索引页到底在哪,所以我根据书中的描述这里初步推断,Insert Buffer Bitmap记录的辅助索引页位置是在磁盘中。
好,由此再看上面的那段内容,说,“当Insert Buffer Bitmap检测到磁盘中的辅助索引页没有空间时强制读取辅助索引页“,这个辅助索引页一定指的是磁盘中的辅助索引页,再有“把Insert Buffer中与页相关的信息及待插入的数据插入辅助索引页”,这个操作是merge操作那么这句话中的辅助索引页也就是磁盘中的辅助索引页,好,去掉过程简而言之,Insert Buffer Bitmap检测到辅助索引页没有空间,把B+树中的内容插入到辅助索引页中。这两个辅助索引页,是同一个页,首先是检测到页中没有空间反而把数据插入,这就说明这两个页指的不是同一个页。
那么重新说明,首先可以肯定的是强制读取辅助索引页的这个页一定是磁盘中的辅助索引页,而Insert Buffer Bitmap 检测到的辅助索引页空间不够的这个辅助索引页是在B+树中的页,这样解释就是合理的。
B+树中的页空间不够了,把页插入到磁盘中,空间就空出来了。
本文章是对书中对merge操作发生情况的第二种情况描述内容中辅助索引页歧义的解释。
另外就是Merge Insert Buffer记录的辅助索引页,记录的是B+树中的页,而不是磁盘中的辅助索引页,这个理解起来会比较合理,因为用一个内存中的表去记录磁盘中页空间,这显然不太合理,第一磁盘中的空间大多数情况不需要担心,第二内存中记录磁盘中的信息,那么得至少先将磁盘中相应的数据做一次完整遍历,这也太重了吧,所以Insert Buffer Bitmap中记录的是B+树中的页内存情况是最合理的。
这是我的个人理解,这个部分我研读了很久,也查了一些资料,不过找不到我想要的答案。
欢迎大家留言讨论,这个专栏是专门对这本书的研读问题的提出和解答,欢迎大家来订阅,一起讨问题,欢迎大佬的加入,急切诚恳欢迎!