Mysql数据库之 InnoDB存储引擎

女生的网名这么多〃 提交于 2019-12-10 06:52:31

写在前面,对于mysql数据库存储引擎这块的知识比较杂乱无章,特别是对于存储引擎下面涉及到的理论知识,楼主在第一遍看完《mysql技术内幕 InnoDB存储引擎》后,脑海里只留下一点关于存储引擎的基本概念,就像是看完一场电影一样,可能是缺乏实践操作,也有可能是对于其中的理解不够透彻。所以决定再次阅读该书,并记录自己的笔记,以增强理解记忆。
在这里插入图片描述

InnoDB体系架构

后台线程

InnoDB存储引擎有多个内存块,可以理解这些内存块组成了一个大的内存池,负责一系列工作。
在这里插入图片描述

通过InnoDb存储引擎体系架构可以看出其是一个多线程的模型,后台具有多个不同的线程,负责不同的任务。这里面主要有Master Thread、IO Thread、Purge Thread等线程。具体功能分别如下:

Master Thread:是一个核心线程,主要作用是负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。

IO Thread:主要处理IO请求的回调处理。

Purge Thread:回收不再使用的undolog。

内存

缓冲池

InnoDb存储引擎是基于磁盘存储的,其中的记录是按照页的方式进行管理的。在数据库系统中,CPU的处理速度比磁盘的要快的多,为了不因为磁盘的读写速度拖垮CPU,在CPU和磁盘之间存在一个内存区域称为缓冲区。(具体有关缓存的知识可以看计算机相关专业知识,这里不再赘述)。缓冲区的大小直接影响到数据库的整体性能,对于InnoDb存储引擎来说,缓冲池的配置通过参数innodb_buffer_pool_size来设置。另外要特别注意不要认为缓冲区中缓存的数据类型只有数据页和索引页,缓冲区缓存的数据类型除了索引页和数据页外,还有undo页、插入缓冲、自适应哈希索引等,如下图所示
在这里插入图片描述

缓区的管理

上一节介绍过缓存区是一块内存很大的区域,存放的页的种类也非常多,那么InnoDb存储引擎是如何管理这块大的内存的呢。答案是采用LRU算法来管理的。关于LRU算法,楼主想到了计算机操作系统里面的分页、调页的LRU(不懂得可以去翻阅资料了解下),这里的算法和计算机操作系统里面的是一模一样的,只是InnoDb存储引擎对LRU算法做了一点优化。我们知道传统的LRU算法是将新的页插入到LRU列表的头部,但是在数据库中并不是这样。InnoDb存储引擎在LRU列表中加入了一个midpoint,新加入的页不是直接放到LRU列表的头部,而是放在了midpoint位置。另midpoint位于LRU列表大小的5/8处。这里楼主当时读到这个地方有个疑问,既然传统的LRU算法已经可以很好的解决分页、调页问题,至少计算机操作系统里面是采用过的,说明在大多数场景下,朴素的LRU算法是实用的。但是InnoDB存储引擎为什么要将LRU改进呢?这是因为如果将读取到的页直接放到首页,某些SQL操作可能使其他的页刷出内存,常见的操作有数据库扫描操作等,而该操作可能只会仅仅在查询的时候需要,并不是活跃的数据,如果放在LRU首部,就想一个占着茅坑不拉屎的人一样,那些真正的热点数据不能够在首部或者直接被刷新出去,大大降低了数据库执行的效率。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!