原文链接:https://blog.csdn.net/SunZLong/article/details/103923363
首先了解三个参数三个参数:
innodb_buffer_pool_size(缓冲池大小)
innodb_buffer_pool_chunk_size(定义InnoDB缓冲池大小调整操作的块大小)
innodb_buffer_pool_instances(InnoDB 缓冲池划分为的区域数)
关于两个参数的关系,在MySQL8.0的官方文档中:
Buffer pool size must always be equal to or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances. If you alter the buffer pool size to a value that is not equal to or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances, buffer pool size is automatically adjusted to a value that is equal to or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances.
翻译为:
innodb_buffer_pool_size必须始终等于innodb_buffer_pool_chunk_size或 innodb_buffer_pool_instances的倍数。如果将缓冲池大小更改为不等于innodb_buffer_pool_chunk_size 或 innodb_buffer_pool_instances的倍数,则缓冲池大小将自动调整为等于innodb_buffer_pool_chunk_size 或 innodb_buffer_pool_instances的倍数。
所以得到第一个结论:
1、innodb_buffer_pool_size必须为 innodb_buffer_pool_instances 的倍数。
那么这个比例,应该怎么设置才好呢?
再继续看官方文档关于innodb_buffer_pool_instances参数的说明:
通过这一部分的内容,我们可以知道 innodb_buffer_pool_instances参数的功能 是:
- 对于缓冲池在数千兆字节范围内的系统,通过减少争用不同线程对缓存页面进行读写的争用,将缓冲池划分为多个单独的实例可以提高并发性。
- 使用散列函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例。每个缓冲池管理自己的空闲列表, 刷新列表, LRU和连接到缓冲池的所有其他数据结构,并受其自己的缓冲池互斥量保护。
除32位Windows系统的其它所有平台上innodb_buffer_pool_instances参数的默认值为:
- innodb_buffer_pool_size<1G时,默认值为1;
- innodb_buffer_pool_size>1G时,默认值为8。
32位Windows系统上的默认值取决于的值 innodb_buffer_pool_size,如下所述:
- 如果 innodb_buffer_pool_size 大于1.3GB,则默认 innodb_buffer_pool_instances 值为 innodb_buffer_pool_size/ 128MB,每个块都有单独的内存分配请求。选择1.3GB作为边界,在该边界处32位Windows无法分配单个缓冲池所需的连续地址空间存在很大风险。否则,默认值为1。
所以可得第二个结论:
2、在Linux平台上,innodb_buffer_pool_size大于或等于1GB 时,默认值为8 。否则,默认值为1。
那究竟如何设置才能更好优化MySQL缓冲池的性能? 继续看官方文档:
- 这里继续解释了innodb_buffer_pool_instances参数的作用,要启用多个缓冲池实例,请将innodb_buffer_pool_instances配置选项设置为 大于1(默认)的值,最大为64(最大)。仅当您将innodb_buffer_pool_size大小设置为1GB或更大时,此选项才生效 。您指定的总大小将分配给所有缓冲池。为了获得最佳效率,指定的组合 innodb_buffer_pool_instances 和innodb_buffer_pool_size,使得每个缓冲池实例是至少为1GB。
所以可得第三个结论:
3、innodb_buffer_pool_instanes的值最大为64,innodb_buffer_pool_instances 和 innodb_buffer_pool_size的组合,每个缓冲池实例至少为1GB。
通过查阅一些资料了解到:
- MySQL 5.5引入了缓冲实例作为减小内部锁争用来提高MySQL吞吐量的手段。
- 很多用户反映在自己的测试中,在5.5版本中这个参数对提升吞吐量帮助很小(innodb_buffer_pool_size=2G时,innodb_buffer_pool_instances=1的性能最高),然后在MySQL 5.6版本这个提升就非常大了,所以在MySQL 5.6和5.7或者更高的版本中你可以设置为8-16个缓冲池实例。
针对当前MySQL企业用户的实际环境(大内存):
1、在专用数据库服务器上,可以将innodb_buffer_pool_size设置为计算机物理内存大小的80%;
2、在innodb_buffer_pool_size设置比较大的情况下,可以将innodb_buffer_pool_instances的值设置为8-16,保证一个pool 10G以上。
(注意innodb_buffer_pool_size必须为 innodb_buffer_pool_instances 的倍数)
最新评论
这个牛
放下欲望,男人从来不醉,充分且必要
勇气、责任、自信、创新,为天下先!
软件即数据,软件即服务,软件即管理,软件就是对人类各种社会活动的仿真和记录。软件很重要,但软件不可能凌驾于业务之上,尤其不可能高人一等。