共计 2542 个字符,预计需要花费 7 分钟才能阅读完成。
mysql 中的 change buffer 是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
首先:正常 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,优化定期批量写磁盘。
画外音:例如,账单流水业务。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。