MySQL数据库日志之WAL机制和Buffer Pool

WAL 机制(Write-Ahead-Logging)

先磁盘之前先写入日志文件到磁盘,也就是 redo log 中的后台系统线程,每 1 秒进行一次对 redo log Buffer 刷盘操作。

  • 标准的Undo Log这一步是靠WAL实现的,也就是要求Undo写入先于数据落盘。
    • 对于,undo log 的 WAL 机制,只是相对于提交事务后的刷盘和线程轮询刷盘。只写一次盘,走 redolog 。
  • redo log 在事务没有提交前的刷盘,也使用了 WAL 机制,写入先于数据落盘。
  • binlog 要求一次写入,write 也只是写入到文件缓存(page cache),事务提交的时候,再把 binlog cache 写到 binlog 文件中。
    • 但是我们可以通过 binlog_cache_size 参数控制单个线程 binlog cache 内存大小,如果存储内容超过了这个参数,就要暂存到磁盘。这里应用了 WAL 机制,日志先于数据落盘。

Buffer Pool(缓存池) 的作用

MySQL 的数据都是存在磁盘中的,那么要更新一条记录的时候,得先要从磁盘读取该记录,然后在内存中修改这条记录。那修改完的记录是选择继续写入磁盘,还是缓存起来???

当然是缓存,这样下次有查询语句命中了这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了。

为此 InnoDB 引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。

有了 Buffer Pool 后:

  • 当读取数据是,如果数据存在于 Buffer Pool 中,客户端就会直接读取 Buffer Pool 中的数据,否则再去磁盘中读取。
  • 当修改数据时如果数据存在于 Buffer Pool 中,那么直接修改 Buffer Pool 中的数据所在的页,然后将其页设置为脏页(该页的内存数据和磁盘上的数据已经不一致), 为了减少磁盘 I/O,不会立即将脏页写入磁盘,后续由后台线程选择一个合适的时机将脏页写入到磁盘。

Buffer Pool 缓存了什么?

InnoDB 会把存储的数据划分为如干个【页】(数据页),以页作为磁盘和内存交互的基本单位,一个页的默认大小为 16 KB。因此,Buffer Pool 同样需要按照【页】来划分。

在 MySQL 启动的时候,InnoDB 会为 Buffer 申请一片连续的内存空间,然后按照默认 16 KB 的大小划分一个个页,Buffer Pool 中的页就叫缓存页。此时这些缓存页都是空闲的,之后随着程序的运行,才会由磁盘上的页被缓存到 Buffer Pool 中。

Buffer Pool 缓存了什么?

数据页,索引页,插入缓存页,undo,自适应哈希索引,锁信息

undo 页 是记录是什么?

开启事务后,InnoDB 层更新记录前,首先要记录相应的 undo log,如果是更新操作,需要把被更新的列的 旧值记下来,也就是要生成一条 undo log,undo log 会写入 Buffer Pool 中的 undo 页面。

undo log 的记录的是开启事务时的值,如果是更新操作就要存到缓存中(脏页 undo 页),后面系统线程会刷脏。

对于,undo log 的 WAL 机制,只是相对于提交事务后的刷盘和线程轮询刷盘。

只写一次盘,走 redolog 。

查询一条记录,就只需要缓冲一条记录吗?

不是的。

当我们查询一条记录时,InnoDB 是会把整个页的数据加载到 Buffer Pool 中,将页加载到 Buffer 后,再通过页里的【页目录】去定位到某条具体的记录。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值