doublewrite buffer

本文介绍了InnoDB存储引擎中的双写缓冲机制。通过详细解释双写缓冲结构体的各个字段,展示了双写缓冲如何在内存中占用128个页面,并在启动过程中与物理文件进行比较并更新。

http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/

 

 

 

 doublewrite buffer不是在内存中的,是在硬盘中分配了一块连续的空间,

在启动的过程中,会把那128个页面和物理文件中的比较一下,如果不同,就覆盖

 

### Buffer Pool Buffer Pool是InnoDB存储引擎的一个内存缓存区域,主要用于缓存表和索引的数据。当执行查询操作时,存储引擎首先会在Buffer Pool中查找所需的数据页。若页在内存中,即缓存命中,可直接读取;若页不在内存中,即缓存未命中,则从磁盘的表空间文件(`.idb`文件)中加载到Buffer Pool再读取。当Buffer Pool内存占满时,会通过LRU策略淘汰使用次数较少的页的数据,多次淘汰后留下的数据为使用频率较高的热数据。空闲的数据块由Free链表记录[^2][^3]。 查看Buffer Pool相关信息的SQL语句示例: ```sql -- 缓冲池大小 SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; -- 缓冲池实例数 SHOW VARIABLES LIKE 'innodb_buffer_pool_instances'; ``` ### Doublewrite Buffer Doublewrite Buffer可以理解为是一个备份(recovery)。MySQL在将数据刷到磁盘之前,会先把数据写到Doublewrite Buffer,写完后再开始写磁盘。万一发生crash,就可以利用Doublewrite Buffer来修复磁盘里的数据[^1]。 ### Log Buffer Log Buffer是InnoDB存储引擎用于临时存储redo log日志的内存区域。redo log是用来记录事务对数据库的物理修改操作,以保证在数据库崩溃恢复时可以通过redo log将未持久化到磁盘的数据恢复。Log Buffer的存在是为了减少磁盘I/O操作,因为将日志先写入内存中的Log Buffer,然后再批量写入磁盘,比每次事务提交都直接写磁盘效率更高。当事务提交时,Log Buffer中的日志会根据配置的`innodb_flush_log_at_trx_commit`参数决定何时刷新到磁盘。 ### Change Buffer Change Buffer是一种特殊的缓存,用于缓存对非唯一二级索引页的修改操作。当对非唯一二级索引进行插入、更新、删除操作时,如果对应的索引页不在Buffer Pool中,不会立即将索引页从磁盘加载到内存进行修改,而是将这些修改操作记录在Change Buffer中。之后,当这些索引页被读取到Buffer Pool时,再将Change Buffer中对应的修改操作应用到索引页上,这个过程称为merge。Change Buffer的使用可以减少磁盘I/O,提高对非唯一二级索引操作的性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值