type
status
date
slug
summary
tags
category
icon
password
整理定义
The general term for the features involving the change buffer, consisting of insert buffering, delete buffering, and purge buffering. Index changes resulting from SQL statements, which could normally involve random I/O operations, are held back and performed periodically by a background thread. This sequence of operations can write the disk blocks for a series of index values more efficiently than if each value were written to disk immediately. Controlled by theinnodb_change_buffering
andinnodb_change_buffer_max_size
configuration options.
Change Buffer是一种特殊的数据结构,当二级索引页不在Buffer Pool中时,它会缓存对这些页的更改。 Change Buffer可能由 INSERT、UPDATE 或 DELETE 操作 (DML) 产生,稍后当其他读取操作将页面加载到缓冲池中时,这些更改将被 Merge 合并。
![notion image](https://image.kuangyichen.com/image/innodb-change-buffer.png?t=5af10adb-aedf-4c10-943a-74355b6099a8)
复述展开
为什么需要Change Buffer?
与聚簇索引不同,二级索引通常是非唯一的,并且对二级索引的插入操作发生在相对随机的顺序中。同样,删除和更新操作可能会影响不相邻的二级索引页。在其他操作将受影响的页读入缓冲池时,合并缓存中的更改可以避免需要从磁盘读取二级索引页的大量随机访问I/O。
Change Buffer 的清理与更新机制?
定期地,在系统大部分空闲或慢速关闭时运行的清理操作将更新的索引页写入磁盘。清理操作可以更高效地写入一系列索引值的磁盘块,而不是立即将每个值写入磁盘。
当有许多受影响的行和众多二级索引需要更新时,更改缓冲合并可能需要几个小时。在此期间,磁盘I/O增加,可能会导致磁盘限制的查询显著减慢。更改缓冲合并可能会在事务提交后继续发生,甚至在服务器关闭和重启后也会继续发生。
Change Buffer 在内存中与磁盘上所在的位置
在内存中,更改缓冲占用缓冲池的一部分。在磁盘上,更改缓冲是系统表空间的一部分,在数据库服务器关闭时缓冲索引更改。
两个关键配置
在配置Change Buffer时,有几个配置项需要注意:
innodb_change_buffering
:这个配置项用于控制哪些类型的操作可以被缓存在Change Buffer中。默认值是"all",表示所有类型的操作都可以被缓存。你可以根据你的应用的特性来调整这个配置项。关于配置的具体内容,可以查看附录。
innodb_change_buffer_max_size
:这个配置项用于控制Change Buffer可以使用的内存的最大比例。默认值是25,表示Change Buffer可以使用InnoDB缓冲池的25%的内存。如果你的应用有大量的插入、删除和更新操作,你可能需要增加这个值。
Change Buffer 启用的场景
因为它可以减少磁盘读取和写入,所以更改缓冲对于 I/O 密集型工作负载最有价值; 例如,具有大量 DML 操作(例如批量插入)的应用程序可以从更改缓冲中受益。
但是,更改缓冲区占用了缓冲池的一部分,从而减少了可用于缓存数据页的内存。 如果工作集几乎适合缓冲池,或者表的二级索引相对较少,则禁用更改缓冲可能会很有用。 如果工作数据集完全适合缓冲池,则更改缓冲不会带来额外的开销,因为它仅适用于不在缓冲池中的页面。
理解体会
Change Buffer是MySQL数据库InnoDB存储引擎的一个特性,主要用于优化磁盘I/O操作。当InnoDB需要修改一个数据页,但该数据页当前不在内存中时,InnoDB可以选择将这些修改操作(如插入、删除和更新操作)缓存在Change Buffer中,而不是立即将数据页加载到内存中。然后,在后台或者在数据页被加载到内存中时,InnoDB会将这些修改操作应用到数据页上。
Change Buffer的主要作用是减少磁盘I/O操作,提高数据库的性能。特别是在大量插入、删除和更新操作的场景下,Change Buffer可以显著提高数据库的性能。
使用Change Buffer的方式很简单,你只需要在你的MySQL配置文件中设置上述的配置项,然后重启MySQL服务即可。但是,你需要根据你的应用的特性和你的硬件资源来合理配置Change Buffer,以达到最佳的性能。
总的来说,Change Buffer是InnoDB的一个强大的特性,可以显著提高数据库的性能。但是,使用Change Buffer需要一定的专业知识,如果配置不当,可能会影响数据库的性能和稳定性。因此,我们在使用Change Buffer时,需要谨慎小心。
附录
Command-Line Format | --innodb-change-buffering=value |
System Variable | |
Scope | Global |
Dynamic | Yes |
SET_VAR Hint Applies | No |
Type | Enumeration |
Default Value | all |
Valid Values | none
inserts
deletes
changes
purges
all |
Value | Numeric Value | Description |
none | 0 | Do not buffer any operations. |
inserts | 1 | Buffer insert operations. |
deletes | 2 | Buffer delete marking operations; strictly speaking, the writes that mark index records for later deletion during a purge operation. |
changes | 3 | Buffer inserts and delete-marking operations. |
purges | 4 | Buffer the physical deletion operations that happen in the background. |
all | 5 | The default. Buffer inserts, delete-marking operations, and purges. |
参考:
快速跳转链接
【概念解析】启动
【概念解析】Day 1 - 10
【概念解析】Day 11 - 20
【概念解析】Day 21 - 30
【概念解析】Day 31 - 40
【概念解析】Day 41 - 50
【概念解析】Day 51 - 60
【概念解析】Day 61 - 70
【概念解析】Day 71 - 80
【概念解析】Day 81 - 90
- 作者:eachenkuang
- 链接:https://kuangyichen.com/article/industry-day60
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。