今天想和大家聊一聊 MySQL 中的 redo log,其实最早我是想聊两阶段提交的,后来想想可能有小伙伴还不了解 binlog,所以就先整了一篇 binlog:
- 手把手教你玩 MySQL 删库不跑路,直接把 MySQL 的 binlog 玩溜!
- MySQL删库不跑路(视频版)
1. 谁的 redo log学习 redo log,我觉得首先要搞明白一个问题,就是是谁的 redo log?
我们知道,MySQL 架构整体上分为两层:Server 层和存储引擎层,如下图:
文章插图
前面松哥文章+视频跟大家聊的 binlog,是 MySQL 自己提供的 binlog,而 redo log 则不是 MySQL 提供的,而是存储引擎 InnoDB 自己提供的 。所以在 MySQL 中就存在两类日志 binlog 和 redo log,存在两类日志既有历史原因(InnoDB 最早不是 MySQL 官方存储引擎)也有技术原因,这个咱们以后再细聊 。
先把这个问题搞清楚,后面很多地方就容易懂了 。
2. buffer pool在正式介绍 redo log 之前,还有一个 buffer pool 需要大家了解 。
小伙伴们知道,InnoDB 引擎存储数据的时候,是以页为单位的,每个数据页的大小默认是 16KB,我们可以通过如下命令来查看页的大小:
文章插图
16384/1024=16
刚好是 16KB 。
计算机在存储数据的时候,最小存储单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如 XFS/EXT4)最小单元是块,一个块的大小是 4KB,也就是四个块组成一个 InnoDB 中的页 。我们在 MySQL 中针对数据库的增删改查操作,都是操作数据页,说白了,就是操作磁盘 。
但是大家想想,如果每一次操作都操作磁盘,那么就会产生海量的磁盘 IO 操作,如果是传统的机械硬盘,还会涉及到很多随机 IO 操作,效率低的令人发指 。这严重影响了 MySQL 的性能 。
为了解决这一问题,MySQL 引入了 buffer pool,也就是我们常说的缓冲池 。
buffer pool 的主要作用就是缓存索引和表数据,以避免每一次操作都要进行磁盘 IO,通过 buffer pool 可以提高数据的访问速度 。
通过如下命令可以查看 buffer pool 的默认大小:
文章插图
134217728/1024/1024=128
默认大小是 128MB,因为松哥这里的 MySQL 是安装在 Docker 中,所以这个分配的小一些 。一般来说,如果一个服务器只是运行了一个 MySQL 服务,我们可以设置 buffer pool 的大小为服务器内存大小的 75%~80% 。
3. change buffer在正式介绍 redo log 之前,还有一个 change buffer 需要大家了解 。
前面我们说的 buffer pool 虽然提高了访问速度,但是增删改的效率并没有因此提升,当涉及到增删改的时候,还是需要磁盘 IO,那么效率一样低的令人发指 。
为了解决这个问题,MySQL 中引入了 change buffer 。change buffer 以前并不叫这个名字,以前叫 insert buffer,即只针对 insert 操作有效,现在改名叫 change buffer 了,不仅仅针对 insert 有效,对 delete 和 update 操作也是有效的,change buffer 主要是对非唯一的索引有效,如果字段是唯一性索引,那么更新的时候要去检查唯一性,依然无法避免磁盘 IO 。
change buffer 就是说,当我们需要更改数据库中的数据的时候,我们把更改记录到内存中,等到将来数据被读取的时候,再将内存中的数据 merge 到 buffer pool 然后返回,此时 buffer pool 中的数据和磁盘中的数据就会有差异,有差异的数据我们称之为脏页,在满足条件的时候(redo log 写满了、内存写满了、其他空闲时候),InnoDB 会把脏页刷新回磁盘 。这种方式可以有效降低写操作的磁盘 IO,提升数据库的性能 。
通过如下命令我们可以查看 change buffer 的大小以及哪些操作会涉及到 change buffer:
文章插图
- innodb_change_buffer_max_size:这个配置表示 change buffer 的大小占整个缓冲池的比例,默认值是 25%,最大值是 50% 。
- innodb_change_buffering:这个操作表示哪些写操作会用到 change buffer,默认的 all 表示所有写操作,我们也可以自己设置为 none/inserts/deletes/changes/purges 等 。
推荐阅读
- HttpClient使用
- MySql索引 | 什么是索引呢?索引是什么样子的?
- 香糯红薯饼的做法
- 香肠鸡蛋饼的做法
- 红茶为什么叫工夫红茶,政和工夫红茶存放多久
- 买眼镜需要注意什么
- macOS不需要分区!因为有APFS文件系统
- linux系统下安装mysql 8.0.26配置文件my.cnf详细注解
- 为什么总说Java的反射效率低?
- 办了1000M宽带,为什么网速不见提升?安装小哥:自查6个“设备”