MySQL之Innodb_buffer_pool_size设置

缓冲池是用于存储InnoDB表,索引和其他辅助缓冲区的缓存数据的内存区域。缓冲池的大小对于系统性能很重要。更大的缓冲池可以减少磁盘I/O来多次访问同一表数据。在专用数据库服务器上,可以将缓冲池大小设置为计算机物理内存大小的60%-80%

查看设置的缓存池内存

mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                          11.000000000000 |
+------------------------------------------+
1 row in set (0.00 sec)

合理的设置缓存池相关参数

innodb_buffer_pool_size 默认设置系统内存百分之80%左右,后按如下规则配合实际情况调整
mysql> show global status like 'Innodb_buffer_pool_pages_data';
+-------------------------------+--------+
| Variable_name                 | Value  |
+-------------------------------+--------+
| Innodb_buffer_pool_pages_data | 542629 |
+-------------------------------+--------+
1 row in set (0.00 sec)

mysql> show global status like 'Innodb_buffer_pool_pages_total';
+--------------------------------+--------+
| Variable_name                  | Value  |
+--------------------------------+--------+
| Innodb_buffer_pool_pages_total | 720896 |
+--------------------------------+--------+
1 row in set (0.00 sec)


# 计算是否应该添加内存
使用率 = Innodb_buffer_pool_pages_data/Innodb_buffer_pool_pages_total*100%
当结果 > 95% 则增加 innodb_buffer_pool_size
当结果 < 95% 则减少 innodb_buffer_pool_size, 可适当较减少,当然如果是独享业务机器多了也没问题

判断当前数据库内存是否达到瓶颈,从而调整缓存池大小
如何判断当前数据库的内存是否已经达到瓶颈了呢?可以通过查看当前服务器的状态,比较物理磁盘的读取和内存读取的比例来判断缓冲池的命中率,即通过 缓存池命中率来判断,我们可以这样得到相关参数:

缓存池命中率计算方法

命中率 = (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests

其中,Innodb_buffer_pool_read_requests表示从缓冲池中读取的请求数量,Innodb_buffer_pool_reads表示从磁盘中读取的数据块数量。可以通过执行以下命令来查看这些变量的值:

mysql> show global status like 'Innodb_buffer_pool_read_requests';
+----------------------------------+---------------+
| Variable_name                    | Value         |
+----------------------------------+---------------+
| Innodb_buffer_pool_read_requests | 1931674136541 |
+----------------------------------+---------------+
1 row in set (0.00 sec)

mysql> show global status like 'Innodb_buffer_pool_reads';
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| Innodb_buffer_pool_reads | 197400647 |
+--------------------------+-----------+
1 row in set (0.00 sec)

根据上面信息,可以计算出缓冲池的命中率为:(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests,即 (1931674136541 - 197400647) / 1931674136541 = 0.898。缓冲池的命中率为89.8%
如果命中率太低,则应考虑扩充内存,增加innodb_buffer_pool_size的值。即使缓冲池的大小已经大于数据库文件的大小,这也并不意味着没有磁盘操作。数据库的缓冲池只是一个用来存放热点的区域,后台的线程还负责将脏页异步地写入到磁盘。此外,每次事务提交时还需要将日志写入重做日志文件

调整方式
在线修改,5.7以后可以。但是要注意修改innodb_buffer_pool_size 可能造成业务波动。但也最好选择业务低峰期和没有大事务操作时候进行,同时要修改MySQL配置文件,防止重启后恢复到原来的值
应用单位字节 在线单位转换:https://calc.itzmx.com/

SET GLOBAL innodb_buffer_pool_size = 2147483648  #2G

配置文件方式,修改后重启

[mysqld]
innodb_buffer_pool_size = 2147483648  #设置2G
innodb_buffer_pool_size = 2G  #设置2G
innodb_buffer_pool_size = 500M  #设置500M
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容