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 后,再通过页里的【页目录】去定位到某条具体的记录。
标签:WAL,log,Buffer,undo,缓存,MySQL,磁盘,Pool From: https://blog.csdn.net/X2512261315/article/details/142412060