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等等资料也都分享给大家。回复【资料】即可获取进阶内容相关资料