参考:小林coding
仅作学习用
MySQL有哪些日志?
- undo log:是InnoDB存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和MVCC
- redo log:是InnoDB存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复
- binlog:是Server层生成的日志,主要用于数据备份、回滚和主从复制
undo log
undo log是一种用于事务回滚的日志,在事务没提交之前,MySQL会先记录本次事务中更新前的数据到undo log中,当事务需要回滚时,可以使用undo log进行回滚。
每当InnoDB引擎进行增删改操作时,都会把回滚时需要的信息记录到undo log里,发生回滚时,就读取undo log,与原先做取反操作,比如:
- 在插入记录时,把记录的主键记录下来,回滚时只需要把主键对应的记录删除即可。
- 在删除记录时,把记录的内容记录下来,回滚时把记录重新插入即可。
- 在更新记录时,把记录的旧值记录下来,回滚时再把这些记录更新为旧值即可。
由此,undo log就实现了事务回滚,保障事务原子性。
关于它的另一个功能MVCC,可以查看我的另一篇文章《MySQL事务详解》。
Buffer Pool
在介绍redo log之前,首先我们需要了解一下buffer pool。
为什么需要buffer pool?
虽然说MySQL的数据是存储在硬盘里面的,但是因为硬盘的读写速度相对内存来说较慢,所以如果每次读写数据都要从硬盘里面读取出来再做操作,性能就会很差。
为了提高性能,InnoDB存储引擎设计了Buffer Pool作为缓存。
- 当读取数据时,如果数据存在于Buffer Pool中,MySQL就会直接从Buffer Pool取出数据返回给客户端,否则才会去硬盘中加载。
- 当修改数据时,首先会修改Buffer Pool中的数据,并将该数据所在的页标记为脏页,最后由后台线程将脏页写入到磁盘。
Buffer Pool有多大?
默认配置下Buffer Pool的大小为128MB。
Buffer Pool的大小由配置项innodb_buffer_pool_size参数决定,一般建议设置成可用内存的60%~80%。
Buffer Pool缓存什么?
InnoDB会把存储的数据划分成若干个“页”,以页作为磁盘和内存交互的基本单位,一个页的默认大小为16KB,因此,Buffer Pool同样按照一个个页来划分。
在MySQL启动时,InnoDB会为Buffer Pool申请一片连续的内存空间,然后按照默认的16KB大小划分出一个个页,此时这些缓存页都是空闲的,随着程序运行,才会有磁盘的页被缓存到Buffer Pool中。