开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情
mysql的buffer pool
前文
本文内容主要是关于mysql中的缓存池,也就是buffer pool相关知识的整理及总结,包含buffer pool的组成及其使用等内容。
buffer pool
首先来了解一下什么是mysql的buffer pool。buffer pool指的是数据库引擎层面的一个缓存结构,注意不是mysql底层,而是存在于存储引擎层的缓存池。实际上在查询过程中,低版本的mysql会首先到服务层的缓存中进行数据的查找,注意这不是本文中的buffer pool,查找不到的情况下继续到存储引擎层进行数据查找,才会利用到本文中的buffer pool,另外一点是高版本的mysql已经移除了服务层的缓存结构。
说完了什么是缓存池,再来看一下缓存池的主要组成部分。缓存池中主要包含的内容包括数据页、索引页、undo log(用于事务回滚)以及锁相关信息等等内容,也就是查询中所需要的大部分内容都可以缓存在存储引擎层的缓存池中。而实际缓存池在使用过程中,当sql语句执行完毕,需要将数据进行缓存,又如何找到对应的缓存页呢?这主要是通过缓存页中额外存储的信息部分,每个缓存页中都会使用一小部分信息作为控制模块,存储缓存页所对应的表空间信息。当缓存页数据进行更新时,直接通过控制模块可以很容易找到对应的缓存页。
由于缓存池的大小是固定的,而数据库中所存储的数据在磁盘中的占用的空间会明显大于缓存池的空间大小。那么缓存池如何进行数据的淘汰及替换呢?常规的数据淘汰策略经常会采用LRU算法进行处理,也就是淘汰最久未被使用的数据。而mysql中的缓存池进行了一部分的调整,由于缓存时不是单独的缓存某个数据页,而是缓存该数据页的前后数据页,可能会导致某些数据页持续不会被使用同时占用空间。因此mysql将缓存的数据与实际查询语句所请求的数据进行了分离,保证实际缓存到的数据会被集中存储,这样当进行缓存数据淘汰时,会先淘汰掉未被使用的数据,尽可能的避免热点数据的缓存失效问题。
而对于mysql数据的修改,实际是先修改缓存中的数据形成脏页。在mysql关闭、缓存池空间满及redo log空间满等情况下,会讲缓存池数据刷写到次盘之中进行数据的持久化,也就是将更新的数据写入磁盘中。
总结
本文主要内容是关于缓存池在mysql中的应用,包含其缓存内容、脏页的持久化以及缓存池数据淘汰策略等内容。