MySQL的InnoDB双写缓冲区和插入缓存

双写缓冲区(Doublewrite Buffer)是 MySQL 数据库中 InnoDB 存储引擎的一种机制,用于解决部分写失效的问题,提高数据的完整性和可靠性。

双写缓冲区由内存和磁盘两部分组成。在内存结构中,它由128个页构成,大小为2MB;在磁盘结构中(MySQL 8.0.20 之前位于 InnoDB 系统表空间,之后位于双写文件中),同样是128个页(2个区,extend1 和 extend2),大小也是2MB。

其工作流程如下:当有写操作(如 insert、update 或 delete)时,首先将数据页通过 memcpy 函数拷贝至内存中的双写缓冲区,然后将双写缓冲区内存中的数据页刷写到双写缓冲区的磁盘上,分两次写入磁盘共享表空间中(每次写 1MB,连续存储,顺序写,性能较高)。完成双写页的写入后,再将内存中的双写缓冲区中的页写入到自己的表空间文件中。

这样做的主要原因是,MySQL 的页通常大小为16KB,而计算机硬件和操作系统写文件时通常以4KB 作为单位,每写一个 InnoDB 的页到磁盘上,在操作系统级别上需要写4个块。如果在这个过程中发生故障,只完成了部分写入,比如只写入了50%的数据,就会导致数据文件处于不一致的状态。而通过双写缓冲区,即使写操作只完成了部分,其中的数据仍然是完整的。在发生故障后,MySQL 重启时可以通过校验和来确认是否有错误数据,如果双写缓冲区文件错误了,就从数据文件中拉取原始数据并根据 redo log 得出正确的目标数据;如果数据文件错误了,则将双写缓冲区中的数据重新写入数据文件。

MySQL 中与双写缓冲区相关的参数配置如下:

innodb_doublewrite:控制是否启用双写缓冲区,可设置为 on 或 off,默认为 on。在大多数情况下建议保持启用,以确保数据的完整性,但如果更关心性能而非数据完整性(例如在执行基准测试时),可以考虑禁用。从 MySQL 8.0.30 开始,该参数还支持DETECT_AND_RECOVER和DETECT_ONLY设置。其中,“DETECT_AND_RECOVER”与“ON”设置相同,即完全启用双写缓冲区,在恢复期间使用它来修复不完整的页面写入;“DETECT_ONLY”则仅用于检测不完整的页面写入,不会将数据库页面内容写入双写缓冲区,恢复时也不会使用它来修复。
innodb_doublewrite_file:指定双写文件的路径和文件名,默认值为ib_logfile0和ib_logfile1。
innodb_doublewrite_buffer_size:控制双写缓冲区的大小,默认值为 256KB。不应设置得过大或过小,以免影响系统性能或导致不必要的内存占用。
innodb_doublewrite_dir(MySQL 8.0.20 中引入):定义 InnoDB 创建双写文件的目录。如果未指定目录,则在innodb_data_home_dir目录(默认为 data 目录)中创建双写文件。哈希符号“#”会自动添加到指定目录名的前缀,以避免与模式名冲突,但如果目录名中已包含前缀“.”“#”或“/”,则不会添加。理想情况下,应将双写目录放在最快的可用存储介质上。
innodb_doublewrite_files:定义双写文件的数量。默认情况下,为每个缓冲池实例创建两个双写文件(一个刷新列表双写文件和一个 LRU 列表双写文件)。刷新列表双写文件用于从缓冲池刷新列表刷新的页面,其默认大小是 InnoDB 页面大小乘以双写页字节数。LRU 列表双写文件用于从缓冲池 LRU 列表刷新的页面,还包含用于单页刷新的槽位,其默认大小是 InnoDB 页面大小乘以(双写页面数 +(512 /缓冲池实例数)),其中 512 是为单页刷新预留的槽位总数。同一时间至少有两个双写文件,且其最大数量是缓冲池实例数量的两倍(缓冲池实例的数量由innodb_buffer_pool_instances变量控制)。双写文件名的格式为“#ib_page_size_file_number.dblwr”...

Change Buffer(更改缓冲区)是 MySQL 中 InnoDB 存储引擎的一种优化机制。

当对非唯一辅助索引进行插入、更新或删除操作时,如果这些页不在缓冲池中,InnoDB 不会立即从磁盘读取这些页到缓冲池,而是将这些操作记录在 Change Buffer 中。之后,当需要访问这些页时(比如通过查询),再将 Change Buffer 中的操作应用到缓冲池中的页上,从而减少磁盘 I/O 操作,提高数据库性能。

Change Buffer 适用于写多读少的业务场景。对于写操作频繁的表,如果辅助索引很多,使用 Change Buffer 可以显著提高性能。

需要注意的是,在某些情况下,如系统空闲时或者表空间压缩时,Change Buffer 中的数据会被合并到数据页中。

相关的配置参数包括:innodb_change_buffer_max_size 用于控制 Change Buffer 占用缓冲池的最大比例。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值