龙空技术网

MySQL数据库缓冲池-Buffer Pool

架构笔记 172

前言:

当前咱们对“mysql数据库缓冲池”都比较着重,兄弟们都想要分析一些“mysql数据库缓冲池”的相关文章。那么小编在网摘上网罗了一些对于“mysql数据库缓冲池””的相关资讯,希望兄弟们能喜欢,我们一起来学习一下吧!

一、为什么要有缓存池Buffer Pool?

MySQL 的 innodb 存储引擎是基于磁盘存储的,并且是按照页的方式进行管理的。

在数据库系统中,CPU 速度与磁盘速度之间的差距是非常大的,为了最大可能的弥补之间的差距,提出了缓存池的概念。

所以缓存池,简单来说就是一块「内存区域」,通过内存的速度来弥补磁盘速度较慢,导致对数据库造成性能的影响。

查看Buffer Pool参数命令如下所示:

# 查看InnoDB的相关参数show engine innodb status;# 查看缓冲池大小select @@innodb_buffer_pool_size;# 查看数据库中缓冲池实例的数量select @@innodb_buffer_pool_instances;

Buffer Pool 是可以有多个的,可以通过 MySQL的配置文件或者参数来配置。

二、缓存池的基本原理

「读操作」:

在数据库中进行读取页的操作,首先把从磁盘读到的页存放在缓存池中,下一次读取相同的页时,首先判断该页是不是在缓存池中。

若在,称该页在缓存池中被命中,则直接读取该页,否则,还是去读取磁盘上的页。

「写操作」:

对于数据库中页的修改操作,首先修改在缓存池中的页,然后再以一定的频率刷新到磁盘,并不是每次页发生改变就刷新回磁盘,而是通过 checkpoint 的机制把页刷新回磁盘。

可以看到,无论是读操作还是写操作,都是对缓存池进行操作,而不是直接对磁盘进行操作。它是 MySQL 当中至关重要的一个组件,可以这么说,MySQL所有增删改查的操作都是在 Buffer Pool 中执行的。

三、缓存池结构

Buffer Pool 是一片连续的内存空间,innodb 存储引擎是通过页的方式对这块内存进行管理的。

Buffer Pool是InnoDB引擎中的一块内存区域,它的默认大小是128M。当MySQL启动的时候就会初始化Buffer Pool,它会根据系统中所设置的innodb_buffer_pool_size大小去内存中申请一块连续的内存空间。缓存池中有多个缓存页。实际申请的内存区域比配置的值稍微大一点,因为缓冲池中的每一个缓存页都附带了一个描述数据块。

不过这个容量(128M)似乎有点小了,生产环境可以根据实际的内存大小进行调整,参数为:innodb_buffer_pool_size=2147483648;单位是字节,2G。

# 在线调整InnoDB缓冲池大小,如果不设置,默认为128Mset global innodb_buffer_pool_size = 2147483648;

设置要根据自己的实际情况来设置,如果设置的值不在合理的范围内,并不是设置越大越好,可能设置的数值太大体现不出优化效果,反而造成系统的swap空间被占用,导致操作系统变慢,降低sql查询性能。

MySQL5.7及以后版本,该参数是动态的,修改后,无需重启MySQL,但是低版本,静态的,修改后,需要重启MySQL。

如何在MySQL中分配合适的innodb_buffer_pool_size?可以进一步查看相关的文章。

缓存池的结构如下图:

可以看到缓存池中包括数据页、索引页、插入缓存、自适应哈希索引、锁信息、数据字段。其中数据页和索引页会用掉多数内存。

标签: #mysql数据库缓冲池