InnoDB Buffer Pool主要是用来缓存数据表和索引数据的内存区域,它的默认值为134217728字节(128MB)。最大值取决于CPU架构;32位系统上的最大值为4294967295(232-1),64位系统上的最大值为18446744073709551615(264-1)。在32位系统上,CPU体系结构和操作系统的实际最大大小可能低于标准的最大大小。当缓冲池的大小大于1GB时,将innodb_buffer_pool_instances设置为大于1的值可以提高繁忙服务器上的可伸缩性。
InnoDB缓冲池更大的场景下,多次访问相同的数据表数据所需要的磁盘I/O就更少。在专用数据库服务器上,可以将缓冲池大小设置为机器物理内存大小的80%。在配置缓冲池大小时要注意以下潜在问题,并准备在必要时缩减缓冲池的大小。
?对物理内存的竞争会导致操作系统分页。
?InnoDB储备增加内存缓冲区和控制结构,以便总分配空间约10%大于指定的缓冲池大小。
?地址空间的缓冲池必须是连续的,可以是一个问题在Windows系统负载在特定地址的dll。
?缓冲池初始化时间大约是与它的大小成正比。对于具有大型缓冲池的实例,初始化时间可能很重要。要缩短初始化周期,可以在服务器关闭时保存缓冲池状态,并在服务器启动时恢复它。
当您增加或减少缓冲池大小时,操作将以块的形式执行。块大小由innodb_buffer_pool_chunk_size配置选项定义,默认值为128mb。
缓冲池大小必须始终等于或多个innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances。如果将缓冲池大小更改为不等于或多个innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值,缓冲池大小将自动调整为等于或多个innodb_buffer_pool_size * innodb_buffer_pool_instances的值。
innodb_buffer_pool_size可以动态设置,这允许您在不重启服务器的情况下调整缓冲池的大小。Innodb_buffer_pool_resize_status变量报告在线缓冲池调整大小操作的状态。
?通过InnoDB api执行的活动事务和操作应该在调整缓冲池大小之前完成。
?当启动调整大小操作时,该操作直到所有活动事务完成后才开始。调整大小操作进行后,需要访问缓冲池的新事务和操作必须等待调整大小操作完成。该规则的一个例外是,当缓冲池被碎片化并在缓冲池大小减小时回收页面时,允许对缓冲池进行并发访问。允许并发访问的一个缺点是,在提取页面时,可能会导致可用页面暂时短缺。
?请注意如果在缓冲池调整大小操作开始后启动嵌套事务,则可能会失败。
?在线调整Innodb缓冲池大小请在业务低峰期进行。
接下来,我们来在线调整InnoDB Buffer Pool
查看当前系统MySQL的InnoDB Buffer Pool Size为128M
mysql> show global variables like '%innodb_buffer%'; +-------------------------------------+----------------+ | Variable_name | Value | +-------------------------------------+----------------+ | innodb_buffer_pool_chunk_size | 134217728 | | innodb_buffer_pool_dump_at_shutdown | ON | | innodb_buffer_pool_dump_now | OFF | | innodb_buffer_pool_dump_pct | 25 | | innodb_buffer_pool_filename | ib_buffer_pool | | innodb_buffer_pool_instances | 1 | | innodb_buffer_pool_load_abort | OFF | | innodb_buffer_pool_load_at_startup | ON | | innodb_buffer_pool_load_now | OFF | | innodb_buffer_pool_size | 134217728 | +-------------------------------------+----------------+ 10 rows in set (0.00 sec)
通过设定全局系统变量innodb_buffer_pool_size来在线调整InnoDB Buffer Pool为1GB
mysql> set global innodb_buffer_pool_size=1073741824; Query OK, 0 rows affected (0.04 sec) mysql> show global variables like '%innodb_buffer%'; +-------------------------------------+----------------+ | Variable_name | Value | +-------------------------------------+----------------+ | innodb_buffer_pool_chunk_size | 134217728 | | innodb_buffer_pool_dump_at_shutdown | ON | | innodb_buffer_pool_dump_now | OFF | | innodb_buffer_pool_dump_pct | 25 | | innodb_buffer_pool_filename | ib_buffer_pool | | innodb_buffer_pool_instances | 1 | | innodb_buffer_pool_load_abort | OFF | | innodb_buffer_pool_load_at_startup | ON | | innodb_buffer_pool_load_now | OFF | | innodb_buffer_pool_size | 1073741824 | +--------------------------