mysql底层原理1002无标题_MySQL我了解得不是深?!MySQL底层-InnoDB缓冲池底层原理分析,就问你深不深...

QQ音乐个性化业务搜索架构之MySQL-InnoDB缓冲池核心原理分析

1.简介

innodb缓冲池是innodb存储引擎主要的一部分内容, 用在数据库数据处理中, 缓冲池在改善性能方面扮演着很重要的角色, 为了保证性能, innodb 维护了自己的缓冲池。

2.缓冲池的组成部分?

innodb由数据页、索引页、自适应哈希、重做日志缓冲、锁信息、写缓冲、额外缓冲池等内容。

作用:缓存磁盘数据;方便快速读取;对磁盘文件修改之前进行缓存

额外内存池(innodb_additional_men pool_size)是什么?

从磁盘检索到数据,并放入到缓冲池中,数据对象里面的一些LRU、锁、等这些数据信息就需要从额外的内存池中进行申请。

申请之后才可以放入到缓冲池里面去

2.1缓冲池维持算法-LRU

整个缓冲池里面的数据都采用列表的方式存储。LRU算法用于数据页的换进换出操作。最频繁的页放在LRU列表的前端,最少的页放在LRU列表的尾端。缓冲池不能存放新读取到的页,会释放LRU列表中尾端的页。改进后的LRU列表加入midpoint位置,即读取的页并不是直接放到LRU列表首部,而是放到LRU列表的 midpoint 位置。

midpoint之后的列表为old列表,之前部分为new列表,默认为5/8处。

为啥数据库的LRU是做了升级处理的?

如果直接将读取到最新的数据放入LRU列表的首部, 那么某些SQL操作(像全表扫描或索引扫描)如果需访问很多页,甚至是全部页(通常仅此次查询操作中需要使用,但它并不是活跃的热点数据),很可能会将活跃的数据挤出LRU列表

2.2缓存预热缓冲池

过参数innodb_buffer_pool_dump_at_shutdown=ON表示关闭MYSQL会把内存中的热点数据保存在磁盘里。重启时就可以从热点数据文件中把数据载入到缓冲池里面。

3.chang buffer

对索引更新记录先插入到insert buffer中,而不是直接调入索引页进行更新。择机执行merge(合并) insert buffer的操作, 将插入缓冲的中的记录合并(merge) 真正的辅助索引里面,然后再插入到磁盘IBD文件。

4.redo log

redo log组成部分:重做日志缓冲 + 重做日志文件

innodb不是每次有事务更新就将脏页刷新到磁盘,因为会产生海量I/O操作,严重影响innodb1的处理性能,既然存在差异,那如果此期间DB出现故障时就会造成数据丢失,而redo log就是为了解决问题。 通过它来管理存储事务的提交动作,防止数据的丢失,也是为了事务的持久性,如果后面数据库重启就会检查这里的数据信息,如果丢失就用它做数据的恢复。

ps redo log buffer如何进行持久化?什么是脏页呢? 大小事务它会怎么操作?

5.double write

每次写入一个page时,先把page写到double write buffer中,如果在双写发生意外时,但数据文件是不受影响的。 下次启动时,可以通过redo log进行恢复,在写double write buffer 成功后。 MySQL就会把 双写 的内容写到数据文件中。如果这个过程出现了意外,重启MySQL可从 双写 找到好的页,在用好的 页 去覆盖磁盘上坏的页。 说白了就是备份镜像

ps:那这个双写缓冲需要持久化? 持久化在什么地方呢?

6.InnoDB后台线程

6.1master thread

作用:将缓冲池的数据异步刷新到磁盘,从而保证数据一致性,脏页的刷新、合并插入缓冲等

6.2InnoDB后台I/O线程

主要用来处理SQL请求操作,针对写请求使用很多AIO的方式,整个I/O的执行是基于回调函数完成的。如果请求过多,可以开启多个读、写线程来提升处理能力。

6.3InnoDB脏页刷新线程

刷新数据库的脏页到磁盘中去。保证数据库与磁盘中的数据是一致。

6.4innodb purge线程

回收已经使用并分配的undo页,减少不必要的内存资源消耗。

7.undo log

记录做了变更操作后,就会产生undo记录,主要记录事务前面数据的状态,用于事务的回滚操作。

像insert操作在事务提交前对当前事务可见,undo log在事务提交后即会被删除。因为新插入的数据无历史版本,无需维护undo log。但对update delete操作则需要维护多版本信息

留意

为方便大家查看,相关的题目和资料作为的PDF的文章,大家需要的可关注我获取这块的资料。同时像数据库、面试、MQ等等资料也都分享给大家。回复【资料】即可获取进阶内容相关资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值