首页 > 数据库 > 数据库开发技术 > 一文了解innodb的架构及缓冲池管理机制
innodb是在mysql中使用最受欢迎的存储引擎,基于mysql插件式的管理存储引擎机制,相对其他存储引擎,innodb提供了事务管理,行级别锁的特性。mysql5.5之后,mysql自带的存储引擎由myisam替换成了innodb,可见innodb的地位随着提升。
先了解下innodb的发展背景和历程:
综上,mysql和innodb最终走到了一起。
innodb如此强大,去了解下他的架构和原理还是很有意义的。innodb架构图如下,总体上分为内存结构和磁盘机构左右两大块,中间通过操作系统缓存作为链接桥梁。今天我将着重介绍左边内存池的相关内容。

图1、架构图
首先将左边部分进行拆解,分为buffer pool 和 log buffer两个缓冲区。
其中buffer_pool包含了缓存数据页,索引页,自适应哈希索引页,锁信息,插入缓冲等模块。
而log buffer是对重做日志进行缓冲。
一个缓冲池实例包含上面两大块内容,innodb允许配置多个缓冲池实例,通过innodb_buffer_pool_instances进行配置,该值默认是1。

上面的内存缓冲是通过什么方式维护的呢?innodb内部创建了很多后台线程对这些缓冲池进行创建更新。下面将图1的左边部分进行放大:

从上图看出,innodb内部创建了master线程,io线程,purge线程,page cleaner等多个线程来管理线程池。
mysql缓冲池按页存储,每页大小16k,读写工作方式:
读:首先将磁盘数据读取到缓冲池(页fix到缓冲池),下次先读取缓冲池(如果有则属于命中,直接读取该页数据),否则读取磁盘上的页。
写:先修改缓冲池中的页,然后再以一定频率刷新回磁盘(Checkpoint机制)
而内存页的分配不是直接分配,而是通过lru,free,flush 三种list来完成内存分配的工作。例如读数据操作,innodb首先从lru列表查询,判断是否命中了缓冲,如果命中了缓冲则直接返回,如果缓冲池没有则从磁盘加载页数据,这个时候不会直接进入lru列表,而是先向free列表申请缓冲空间,申请到了则将free内存页分配到lru列表中,如果分配不成功,则采用lru算法,淘汰lru列表尾部的内存页。将该内存页分配给新申请的页。申请页流程图如下:

除了内存缓冲池,还有一块是重做日志缓冲。innodb存储引擎先将重做日志放入到重做日志缓冲区,然后以一定频率刷新到重做日志文件中。innodb 8.0中重做日志缓冲默认大小是16M,可以根据实际需要调整。

innodb同步重做缓冲区数据到重做日志文件的时机有:
1、master Thread线程每秒将重做日志缓冲刷新到重做日志文件。
2、每个事务提交会执行将同步刷新。
3、当重做日志缓冲区剩余空间大小小于1/2时,执行同步刷新。
好了,今天关于innodb缓冲池知识就介绍这么多了,如果有疑问欢迎留言回复噢。
距离高考还有
距离2020高考只有2天了,最后祝各位高考学子旗开得胜,学弟学妹们加油,加油,加油!!!


原文作者:服务端技术栈;如有侵权,请联系管理员删除。