谈一谈mysql innoDB的缓冲池与日志文件

本文深入探讨了MySQL InnoDB的缓冲池(Buffer pool)及其内存管理,包括LRU优化策略,以及InnoDB的逻辑存储结构、日志文件(回滚日志、二进制日志、重做日志)的工作原理。文章还讨论了刷页机制、检查点技术和慢查询日志,提供数据库性能优化的见解。
摘要由CSDN通过智能技术生成

Buffer pool

innoDB有一块内存区用来充当应用层面的磁盘缓存(page cache),可以缓存磁盘中加载出来的数据、磁盘页面,称为buffer pool。
缓冲池技术避免每次都访问磁盘,而是查询内存上的缓存数据,以加速对数据的访问。缓冲池以页(16K)为单位

内存链表

缓冲池是通过LRU算法进行管理内存页面的。频繁使用的页面放在头部,当缓冲池没有空闲内存时,则释放尾部的页面,如果是脏页就进行同步,否则直接释放(将该页面的内存地址挂载到空闲页面链表中)。

传统LRU的两个问题及innoDB的优化策略:
【1】页面“内存泄露”——预读失效:当缓冲池存在空闲的时候,系统会提前放入某些页,但是最终这些页没有被使用。
优化:对LRU列表进行了分代优化,默认以5:3分为了新生代和老年代,预读页存放至老年区,真正被访问的数据页存入新生区

【2】缓冲池污染:进行大范围扫描时,进入缓冲池的页可能将列表中原始的页面全部排挤出去,导致大量热数据被换出。
优化:通过老年代停留策略,短时间内被大量载入的页存入老年代,且如果一段时间后这些页仍然存留在老年代则插入新生代(即这个时间内没有被后来的新页挤出去)【这里的老年代和新生代和GC的不能相提并论,这里老年代指的是old页面,优先被淘汰的一组页面】

重要的三个参数:
【1】innoDB_buffer_pool_size。为缓冲池申请连续的内存空间(逻辑上连续)
【2】innoDB_old_blocks_pct。老年代比例,如果100则退化为普通的LRU列表
【3】innoDB_old_blocks_time。老年代停留时间窗口。默认1秒钟(即页面被放入老年代后,多久才会被加入年轻代,如果时间窗口结束页面已经被移除列表,就不需要做任何操作)。必须同时满足“被访问”和“老年代停留超过1秒”才会移入新生代头部

刷页

为了避免刷新脏页入磁盘时发生宕机导致数据丢失,目前的事务数据库普遍采用了:当事务提交时,先写重做日志,再修改页(如果事务不提交,那么刷新脏页没有意义)
一旦数据提交,redo buffer中的数据就会写入磁盘、主线程也会每秒将redo buffer的数据写入磁盘(innoDB基于异步I/O,因此可以一次提交多个I/O请求然后交给后台I/O线程响应回调函数),目的是加速事务提交的速度。当重做日志缓冲池空间不足时也会将一部分写入磁盘(循环写)
只要有日志,就可以保证事务的一致性。

脏页通过检查点机制同步磁盘,脏页由缓冲池中的flush链表管理,检查点技术可以异步地将部分脏页刷回磁盘,减少数据库恢复的时间。当缓冲池不够用(需要从LRU列表释放部分页面)时,将脏页刷会内存,当redo 日志不可用时(循环写入时,将被覆盖的部分),刷新脏页。

innoDB通过LSN(日志序列号)来标识版本
数据库宕机时,不需要重做所有页,只需要
对检查点之后的重做日志进行恢复
,大大减少了恢复时间

刷页时机:
【1】mysql正常关闭时
【2】后台线程(page cleaner thread)空闲时
【3】缓冲池换出脏页时
【4】redo日志满了,需要覆盖写,则缓冲池对应脏页应被刷新(如果redo满了,则用户对内存redo log将被暂停,检查点将向前推进,直到具有足够的空间)

当用户执行修改操作后(开启事务前记录undo log),首先会写内存中的数据页,其次写内存中的redo log,当用户提交事务时,默认情况下,redo log刷入磁盘,此时内存中的数据页则一般不会刷入磁盘,但是只要要保证redo log刷入磁盘,就可以保证持久性了
此设计保证了:
【1】用户如果能够从内存中读取到页面,那么页面一定是最新值
【2】如果用户无法从内存中读取页面,那么从磁盘读取的也一定是最新值

InnoDB逻辑存储结构

表空间

表空间可以看作innoDB存储引擎逻辑结构的最高层,所有的数据都存在于表空间,你可以直接在mysql的data文件夹看见。默认的表空间文件为ibdata1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值