innodb_buffer_pool_size参数
它的是一个内存区域,用来缓存 InnoDB
存储引擎的表中的数据和索引数据。以便提高对 InnoDB
存储引擎表中数据的查询访问速度。
在查看 innodb_buffer_pool_size
这个参数值的时候,是以 字节(byte)
为单位进行展现的。它的默认值为 134217728
字节,也就是 128MB
- 134217728/1204/1024=128MB
- 1MB=1024KB
- 1KB=1024Byte
在MySQL 5.7.5版本后,可以在不重启MySQL数据库服务的情况下,动态修改这个参数的值,但是在此版本之前的老版本修改后需要重启数据库服务才可以生效。
相关联的参数
innodb_buffer_pool_chunk_size
默认值为 134217728
字节,即 128MB
。可以按照 1MB
的单位进行增加或减小。
可以简单理解成是 innodb_buffer_pool_size
增加或缩小最小单位。
innodb_buffer_pool_size
是由一个或多个innodb_buffer_pool_chunk_size
组成的。
如果修改了 innodb_buffer_pool_chunk_size
的值将会导致innodb_buffer_pool_size
的值改变。
在修改该参数的时候,需要计算好最后的 innodb_buffer_pool_size
是否符合服务器的硬件配置。
innodb_buffer_pool_instances
默认值为1,最大可以设置为64。
不为1的时候,表示需要启用多个缓冲池实例,即把整个 innodb_buffer_pool_size
在逻辑上划分为多个缓存池,多实例可以提高并发性,可以减少不同线程读写缓存页面时的争用。
innodb_buffer_pool_size
这个参数的设置,离不开innodb_buffer_pool_chunk_size
和 innodb_buffer_pool_instances
的影响
innodb_buffer_pool_size = innodb_buffer_pool_instances * innodb_buffer_pool_chunk_size * x
如果设置的 innodb_buffer_pool_size
的值不是 innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
两者乘积的整数倍(即 x
倍),那么 innodb_buffer_pool_size
会自动调整为另外一个值,使得这个值是上述两者的乘积或者乘积的整数倍.
所以当我们设置 innodb_buffer_pool_size
的值之后,最后的结果并不一定会是我们所设置的结果。
1.innodb_buffer_pool_instances
的取值范围为[1,64]
2.为了避免潜在的性能问题,chunk的数目不要超过1000这个阈值。也就说: innodb_buffer_pool_size
/ innodb_buffer_pool_chunk_size
的值需要在[1,1000)之间。
3.当 innodb_buffer_pool_instances
的值>1
时,总的 innodb_buffer_pool_size
的大小按照 innodb_buffer_pool_instances
的数量划分为多个逻辑上的 buffer_pool
。
每个逻辑上的 buffer_pool
的大小要大于1GB。换算成公式就是说: innodb_buffer_pool_size
/ innodb_buffer_pool_instances
> 1GB
4.innodb_buffer_pool_size
的取值范围建议设置为物理服务器内存的50%~75%,要留一些内存供服务器操作系统本身使用。
如果在数据库服务器上面除了部署MySQL数据库服务,还有部署其他应用和服务,则可以适当再减少对应的百分比。
较小RAM的系统(<= 1GB)
InnoDB缓冲池大小最好采用MySQL默认配置值128MB。
中等RAM (1GB – 32GB)的系统
随着RAM数量的增加以对数的方式增加分配:256MB+256*log2(RAM大小GB)
例如,在一个有3GB内存的系统中,我们会合理分配660MB用于操作系统需求,另外660MB用于MySQL其他需求,这样InnoDB的缓冲池大小约为1.6GB。
较大RAM (> 32GB)的系统
我们将返回到计算系统RAM大小的5%的OS需求,以及计算MySQL其他需求的相同数量。
因此,对于一个RAM大小为192GB的系统,我们的方法将InnoDB缓冲池大小设为165GB左右,这也是使用的最佳值。
如何判断innodb_bufferpool_size是否合适?
方法1 >>>>>>>>
innodb_buffer_pool_reads
The number of logical reads that InnoDB could not satisfy from the buffer pool, and had to read directly from disk
缓存池中不能满足的逻辑读的次数,这些读需要从磁盘中直接读取。
逻辑读是指从缓冲池中读,物理读是指从磁盘读。
innodb_buffer_pool_read_requests
The number of logical read requests
从buffer pool中逻辑读请求次数
从查询SQL命中buffer pool缓存的数据的概率上来判断当前buffer pool是否满足需求,计算从buffer pool中读取数据的百分比如下:
percent = innodb_buffer_pool_read_requests (innodb_buffer_pool_reads + innodb_buffer_pool_read_requests) * 100%
percent>=99%
,则表示当前的buffer pool满足当前的需求。否则需要考虑增加innodb_buffer_pool_size
的值。
方法2 >>>>>>>>
innodb_buffer_pool_pages_data
The number of pages in the InnoDB buffer pool containing data. The number includes both dirty and clean pages.
innodb buffer pool中的数据页的个数,它的值包括存储数据的数据页和脏数据页。
innodb_buffer_pool_pages_total
The total size of the InnoDB buffer pool, in pages.
innodb buffer pool中的总的数据页数目
innodb_page_size
InnoDB page size (default 16KB). Many values are counted in pages; the page size enables them to be easily converted to bytes.
innodb中的单个数据页的大小。
从buffer pool中缓存的数据占用的数据页的百分比来判断buffer pool的大小是否合适:
percent = Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total * 100
percent>=95%
则表示我们的 innodb_buffer_pool_size
的值是可以满足当前的需求的。否则可以考虑增加 innodb_buffer_pool_size
参考值:
innodb_buffer_pool_size = Innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 / (1024*1024*1024)