mysql中的change buffer是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
首先:正常insert的时候,也是首先要判断哪个物理页(包括数据页和索引页)可以insert,然后把这个物理块读取到buffer pool,然后再在内存执行insert 操作,然后再刷新到磁盘;
0)Change Buffer为何提高性能
它缓存的是一个索引页的 dml的操作,而不是具体的数据页,具体的数据页直接就修改了,对非聚集非唯一的索引页修改的时候才可能用到change buffer。当 buffer pool中没有某个索引页,并且需要dml操作这个索引页的数据的时候,不需要先从磁盘读取该索引页到buffer pool,直接把该操作记录到cahnge buffer 中,这里就减少了一次随机io,然后等下次业务需要访问这个索引页的时候,再把这个页读取到buffer poo中,然后change buffer记录的操作和buffer pool中刚读进来的索引页进行merge 操作。
提高性能的地方还有一点是:对于非聚集非唯一索引的更新或者插入操作,不是每次插入或者更新操作完, 都直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,不在则放到change buffer中,然后以一定的频率和情况进行change buffer和辅助索引叶子的merge(合并)操作,这时通常可以将多个索引叶子的dml操作合并到一个操作里(因为在一个索引页中),这里也提高了性能
综上所述 cahnge buffer 性能的提升在于两点:
一:当需要修改的索引页不在buffer pool的时候,不需要先把索引页读取到buffer pool,这里减少了io
二:将多个索引叶子的dml操作合并到一个操作里(因为在一个索引页中),批量merge,这里也提高了性能;
1)change buffer的内容
Change Buffer是一种特殊的数据结构,缓存对二级索引页面的更改并且这些页面不在Buffer Pool中(注意缓存的是对索引叶子的修改,而不是具体的索引叶子)。缓存的changes可能由 Insert 、Delete 和 Update的结果导致。稍后在页面被其他读取操作加载到Buffer Pool的时候合并,
简而言之:Change buffer的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。
3)change buffer 只针对辅助索引而言
对主键索引无效;对辅助索引叶子节点的更改才可能借助change buffer ,如果该列上没有索引,那么就不会借助change buffer了!
4)缓冲池有change buffer 信息固然不错,但他不是单纯是缓存池的一部分,change buffer 和数据页一样,change buffer 是一个B+树,放在共享表空间,默认也就是idbata1,向change buffer 写数据也是需要随机io,但有change buffer后,当buffer 中没有需要修改的叶子块的时候,你不需要把叶子块读进innodb_buffer_cahce中(减少的就是这里的io)只需要把改变写进cahnge buffer即可,然后cahnge buffer中排序最后等待和真正的叶子节点数据合并!批量合并!所以如果更新操作不频繁的时候,并且更新后立马需要读取该页的时候,change buffer 的机制会增加部分io消耗! change buffer 减少了从内存读取硬盘的随机读IO(数据页)操作,换做成批量顺序merge,redo log减少了随机写log操作
5).之所以需要满足索引是辅助索引,并且是非唯一的
因为在插入缓冲时,数据库并不去查找索引页来判断插入的记录的唯一性,如果去查找肯定又会有离散读取的情况发生(随机io),从而导致change buffer 失去意义!
6) change buffer的相关参数
1 innodb_change_buffering 默认是all支持所有DML操作
2 innodb_change_buffer_max_size,默认是25,即缓冲池的1/4。最大可设置为50,采用默认即可
7).合并的操作是在 buffer pool里面进行的
当下一次需要加载这个页面的时候,也就是这个页面有需求的时候,会将Change Buffer内的更改合并到Buffer Pool,随后当服务器在空闲的时候,这个更改会刷到disk(磁盘)上, 或者在不繁忙的时候进行merge,这时候merger操作也是发生在buffer pool;
8).为什么change buffer 存的是 buffer pool中没有的索引页的操作?
因为如果在buffer pool中,那么就直接dml操作对应的索引页了,change buffer 存在就是为了当需要操作的索引页不在buffer pool中,然后不需要立马去磁盘读取该索引页,只有当buffer pool中不存在的时候才可能用到change buffer;
9) 除了数据页被访问,还有哪些场景会触发刷写缓冲中的数据呢?
还有这么几种情况,会刷写缓冲中的数据:
(1)有一个后台线程,会认为数据库空闲时;
(2)数据库缓冲池不够用时;
(3)数据库正常关闭时;
(4)redo log写满时;
画外音:几乎不会出现redo log写满,此时整个数据库处于无法写入的不可用状态。
10)什么业务场景,适合开启InnoDB的写缓冲机制?
先说什么时候不适合,如上文分析,当:
(1)数据库都是唯一索引;
(2)或者,写入一个数据后,会立刻读取它;
这两类场景,在写操作进行时(进行后),本来就要进行进行页读取,本来相应页面就要入缓冲池,此时写缓存反倒成了负担,增加了复杂度。
什么时候适合使用写缓冲,如果:
(1)数据库大部分是非唯一索引;
(2)业务是写多读少,或者不是写后立刻读取;
可以使用写缓冲,将原本每次写入都需要进行磁盘IO的SQL,优化定期批量写磁盘。
画外音:例如,账单流水业务。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。