欢迎来到天天文库
浏览记录
ID:62004776
大小:67.96 KB
页数:8页
时间:2021-04-10
《网易视频云:INNODB insert buffer 简单分析.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、文档网易视频云:INNODBinsertbuffer简单分析网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PASS服务。在线教育、远程医疗、娱乐秀场、在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台。现在,网易视频云与大家分享一下INNODBinsertbuffer简单分析。在mysql5.1之前称为InsertBuffer,优化2级非唯一索引上插入操作的读IO,在5.5之后改名为Chang
2、eBuffer,功能也扩展为2级非唯一索引上的插入、删除、更新、purge的读IO优化。 changebuffer的核心思想,当数据库需要对2级缓存进行修改时,先不从外存读页面,而是将这些更新缓存在内存中,在特定的条件下,统一将这些更新apply到相应的2级索引页面上,这样做可以减少读IO的次数,并且相邻的页面的读IO可以合并。 在源码中的命名一直还是用ibuf,因此之后都用ibuf来指代InsertBuffer InsertBuffer的信息可以在showinnodbstatus中看到,例如:-----
3、--------------------------------INSERTBUFFERANDADAPTIVEHASHINDEX-------------------------------------Ibuf:size7545,freelistlen3790,segsize11336(单位是page)8075308inserts,7540969mergedrecs,2246304merges8/8文档}; 从上述的结构体可以得知,Ibuf实际上也是一棵B+树索引,它与innodb中其他的b+树有着完全一样的结构。
4、Ibuf树中的记录其实就是包含了记录本身,还有记录所在页面号的信息。具体下面会分析。 Ibuf本身和doublewirtebuffer一样属于系统表空间,因此也会物化,特别是在崩溃恢复时也需要考虑在内。 Ibufbitmap用来记录二级非唯一索引中页面的空闲空间的。当插入/更新会引发索引树SMO时,Ibuf不可用,这是因为如若发生SMO,ibuf树中记录的页面信息会部分失效,而具体这些失效页面会最终落,在哪个页面上是未知的。因此每次对bitMap的判断是每次ibuf插入修改时必不可少的步骤。(代码注释ulin
5、tbit_offset:根据page_no和bit计算得来,高5位是byte_offset,低3位是bit_offset),Ibufbitmap也是由一系列的页面构成,每一个IbufBitmap页面记录了一堆索引页面的页面空闲空间状况8/8文档插入操作: 实验方法: createtablet1(idintprimarykeyauto_increment,namevarchar(2000)indexidx1name)engine=innodb; 为了防止buffer中缓存二级索引页面,因此需要事
6、先导入大量数据。 利用inserintoselect语句导入65536条数据,保证次级索引树超过3层。 插入操作在btr_cur_search_to_nth_level方法中会有涉及到ibuf的操作,索引操作在搜索路径时,有一把整棵B+树的大锁。在索引searchpath 方法中去调buf_get_gen时如若缓存未命中,并且是次级非唯一索引,则触发insertbuffer的发动条件 ibuf_should_try函数中剔除cluster索引和unique索引(但是可以指定忽略次级索引的unique特性)
7、 root页面以及非叶页面不会用到insertbuffer(根页面常驻内存) 如果latchMode<=BTR_MODIFY_LEAF即不会发生smo,才会使用insertbuffer,这里要注意的是innodb会先尝试以乐观的BTR_MODIFY_LEAF的方式进行,失败了再调用悲观的BTR_MODIFY_TREE去锁整棵树 当buf_get_gen返回的block为NULL时,进入ibuf_insert方法8/8文档ibuf_insert流程: 1.通过buf_page_hash_get_low检测插入
8、的页面是否未在缓存中命中 2.检测tuplesize是否过大(大于一个空页面的freespace的1/2) 3.乐观进行ibuf_insert_low(BTR_MODIFY_PREV,不修改整棵树) 4.如若3失败,则悲观进行ibuf_insert_low(BTR_MODIFY_TREE,修改整棵树)ibuf_inse
此文档下载收益归作者所有