ITPub博客

首页 > 数据库 > 数据库开发技术 > 一文了解innodb的架构及缓冲池管理机制

一文了解innodb的架构及缓冲池管理机制

原创 数据库开发技术 作者:服务端技术栈 时间:2020-07-05 17:18:54 0 删除 编辑

innodb是在mysql中使用最受欢迎的存储引擎,基于mysql插件式的管理存储引擎机制,相对其他存储引擎,innodb提供了事务管理,行级别锁的特性。mysql5.5之后,mysql自带的存储引擎由myisam替换成了innodb,可见innodb的地位随着提升。

先了解下innodb的发展背景和历程:






2001年前InnobaseOy公司开发innodb插件


2001年,InnobaseOy公司开源innodb源码






                                                                   2005年,oracle公司收购InnobaseOy公司

2008年,sun公司收购mysql公司






2009年,oracle公司收购sun公司



综上,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缓冲池知识就介绍这么多了,如果有疑问欢迎留言回复噢。

距离高考还有





0
2




距离2020高考只有2天了,最后祝各位高考学子旗开得胜,学弟学妹们加油,加油,加油!!!


喜欢就点个在看再走吧

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

请登录后发表评论 登录
全部评论

注册时间:2019-03-08

  • 博文量
    97
  • 访问量
    41429