【MySQL】日志的意义

日志是在逻辑事务对数据库做DML操作时,其所包含的物理事务MTR所记录的,针对所以涉及的Buffer Pool页面的修改记录

假如没有写日志

假如没有写日志,那数据库在做了任何修改之后,必须要直接将Buffer Page刷磁盘,不然如果此时数据库挂了,即使事务已经提交,这些修改还是没办法恢复。这将带来的灾难是,IO大量增加。此时的数据库,相当于是一个简单的文件系统,无论写什么数据,都必须马上刷入磁盘,Buffer Pool的作用可能只是一个用来修改文件页面的临时缓存而已。

假如没有写日志,在数据库做了DML操作之后,数据库可能在事务没有提交时就将Buffer Page刷到磁盘了,但此时需要回滚。而我们知道,回滚段的内容也是通过Buffer Pool管理的,它的每个页和B树页面也是一样的,只是作用不一样而已。由此可知,回滚段数据也是通过REDO日志来保证完整性的。那么如果没有了日志,Buffer Page中的回滚段页面也需要直接写入,没有了任何缓存,性能就会非常低。

假如没有写日志,数据在关闭后再启动时,就不需要做REDO操作了,但需要做UNDO操作,因为UNDO不是通过REDO来恢复的,而是自己写入,所以回滚段是有效的,还可以让没有提交的事务回滚掉,勉强还可以保证数据库的完整性。

综合上面的假设,现在已经明白,日志的作用就是用来保证Buffer Pool页面的数据写入不丢失。反过来说,如果每个Buffer Pool中的Page每次都刷入到磁盘中,这样就不需要REDO日志了,此时的数据库就成了一个文件系统,因为Buffer Pool每次都进行刷盘,相当于每次写完直接写文件。所以说,日志是数据库管理系统与文件系统最核心的区别。

所以如果没有日志,数据库的性能就低到完全没有办法用了。因为IO太大了,同时,这种IO操作都是随机写入,很容易导致IO到达瓶颈,所以为了提高数据库性能,就必须要使用REDO日志操作。

使用日志能提高性能的关键原因:

  1. 因为日志是用来记录Buffer Pool中Page的修改记录的,所以把对Page的写入转化为对日志的写入,那此时Page就需要每次都刷盘,写Page页面只需要在内存中写入即可,性能会非常好
  2. 通常,一个页面是16KB,如果不写日志的话,每次的写入单位还是16KB,即使修改很少量的数据,也是如此。这样会导致无效IO非常严重,反过来说,也只有通过日志机制,才能真正体现出真实写入的数据量,不会存在对IO的浪费,Page的刷盘数量会大大减少
  3. 如果没有写日志,就会每次都刷Page,而这些Page的相对位置是乱的,并不是顺序的,刷盘大多都是随机IO,这对于机械硬盘来说,性能是非常差的,而有了日志,就可以巧妙地将随机IO转化成日志的顺序IO,这将大大地提高IOPS,性能也会非常好
日志文件大小的区别

使用日志对数据库的性能有很大的影响,那对于日志来说,还有什么其他因素会影响数据库的性能呢?那就是日志文件空间容量。

日志在设置好后其容量是固定的,它是循环使用的,如果不够用了,引发的事件是做一个检查点,让最小有效的LSN向前推,让出一部分空间给新产生的日志来使用。也就是说,只要这个日志空间未用完,那么Buffer Pool中的Page就会一直不刷盘,任何修改都是在内存中发生的。

假如当前日志容量设置为128MB,某一个DML操作只针对某一行记录一直做修改操作。每次操作产生日志量为1KB,这样算下来,128MB的日志量可以容纳对这条记录的131072(128MB/1KB)次修改。也就是说,在这么多次修改之后,这个页面才需要刷盘,才会产生一次随机刷盘操作。而如果把日志文件设置为128MB,很容易知道,这将容纳对这条记录的131072次修改,这么多次修改只产生一次随机刷盘操作。而如果还是128MB的话,则需要10次随机刷盘。很明显,日志容量对数据库的性能还是有很大影响的。

但也不是设置得越大越好,这里有以下两点需要注意。

  • 如果设置得非常大,固然性能可能会很好,但如果某一天,数据库异常挂了,此时可能有很多的日志都没有刷盘,也就是Log flushed up to 与 Last checkpoint at 两个值之间相差太多,恢复起来可能需要比较长的时间。但这个一般问题不大,本身挂的概率不大,同时REDO日志的恢复是顺序的,都是根据页面号的大小排序恢复的,所以比较快。同时,在以后的Mysql版本中,会有多线程REDO恢复,这样就更快了,所以这一点不需要太担心。
  • 日志容量大小的设置,最好与Buffer Pool的总大小匹配。如果日志容量太小,Buffer Pool太大,这就会导致Buffer Pool频繁做检查点,大的Buffer Pool不能被好好利用。如果是日志容量很大,而Buffer Pool很小,此时Buffer Page经常会被淘汰出去,增加了IO频次,同时如果数据库意外挂掉,Buffer Pool小的话,恢复起来也会比较慢。一般情况下,Buffer Pool的总大小与日志容量的大小比例最好保持在10-5:1的范围内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值