缓冲池是用于存储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