1. 多Buffer Pool优化数据库并发性能
多线程访问Buffer Pool是用到锁的,但是由于都是在内存内操作,基本是微秒级别,所以性能也不会差多少。
如果资源够,可以分配多个Buffer Pool来提升并发性能,配置如下:
[server]
innodb_buffer_pool_size=8589934592
innodb_buffer_pool_instances=4
即分配8G内存,给4个Buffer Pool。
Mysql的默认规则是,如果分配小于1GB,那么最多就只会给你一个Buffer Pool。
2. 通过chunk来支持运行期间Buffer Pool动态调整
buffer pool由多个chunk组成,大小由innodb_buffer_pool_chunk_size参数控制,默认是128M。
假设设置总大小是8G,由4个组成,每个就2G,每个buffer pool包含16个128M的chunk,每个buffer pool里面的chunk共享一套free、flush、lru这些链表
如果此时要从8G扩容到16G,只要申请128MB的chunk就行了,而不是重新申请16G的连续的内存,copy 原8g的到16g里面,只要chunk是连续的128M就行了、然后把申请到的chunk内存分配给buffer pool。
3. 生产环境设置Buffer Pool大小
推荐设置为机器内存的50%~60%
buffer pool总大小=(chunk大小*buffer pool数量)的2倍数
SHOW ENGINE INNODB STATUS 可以看到当前的Buffer Pool的状态。