bigywater.tech
MySQL / InnoDB · 65

Buffer Pool 实例

查一下本机的buffer pool真实被分成了几个实例,验证'小于1GB就强制单实例'这条文档规则在真实实例上是不是真的成立。

1个实例
本机真实的buffer pool实例数,不是MySQL默认的8
<1GB强制规则
buffer pool小于1GB时instances配置真实不生效

做的事:真实查一下本机的buffer pool被分成了几块

代码SELECT @@innodb_buffer_pool_size, @@innodb_buffer_pool_instances; SELECT POOL_ID, POOL_SIZE FROM information_schema.INNODB_BUFFER_POOL_STATS;

验证:真实只有1个实例,即使配置里可能写着别的数字

实测 · 本机执行输出
@@innodb_buffer_pool_size:       134217728   (128MB)
@@innodb_buffer_pool_instances:  1

information_schema.INNODB_BUFFER_POOL_STATS:
POOL_ID   POOL_SIZE
0         8191   ← 真实只有这一行,只有一个实例

INNODB_BUFFER_POOL_STATS这张表里有几行,就真实对应有几个buffer pool实例——本机只有一行,POOL_ID=0,和@@innodb_buffer_pool_instances=1完全吻合。

验证:这不是巧合,是InnoDB真实的强制规则

MySQL的官方文档写得很明确:innodb_buffer_pool_instances只有在innodb_buffer_pool_size真实达到1GB(准确说是超过innodb_buffer_pool_chunk_size×innodb_buffer_pool_instances这个乘积的门槛,通常对应1GB)的时候才会真实生效;低于这个门槛,不管配置文件里把instances设成几,InnoDB启动时都会真实把它强制压成1——本机查到的innodb_buffer_pool_chunk_size正好也是134217728(128MB),和当前的buffer_pool_size相等,意味着本机连一个"标准chunk"的空间都刚好只够放1个实例。这套设计的用意是把一整块buffer pool拆成多个独立管理的分区,减少多线程并发访问时对同一把内部锁的争用——但如果buffer pool本身很小,拆分反而会增加管理开销、浪费内存对齐产生的碎片,所以InnoDB真实选择在小内存场景下强制退化成单实例。本文没有在这台共享实例上把buffer_pool_size真实调到1GB以上去验证多实例生效的效果,因为这会大幅改变这台服务器的内存占用,而它还同时跑着别的真实业务库。

分步演示:为什么本机的buffer pool真实只有1个实例

每一步都是本文上面用真实查询跑出来的原始结果。

小内存下,多实例这个开关真实被锁死了
这一步新验证的方面

    本文用到的工具

    • 本机 MySQL 26.7.0(InnoDB),information_schema.INNODB_BUFFER_POOL_STATS
    • 没有验证:真实把buffer_pool_size调到1GB以上后多实例生效的效果,出于对共享实例内存占用的顾虑没有测试
    京ICP备2026067502号-1京公网安备11010502063487号