4.InnoDB同时支持多个BufferPool实例
InnoDB用来缓存它的数据和索引的内存缓冲区的大小。把innodb_buffer_pool_size参数值设置得越高,访问表中的数据需要的磁盘I/O就越少。在一个专用的数据服务器上,最高可以将这个参数设置为机器物理内存大小的80%。建议不要设置太高,因为对物理内存的竞争可能在操作系统上导致内存调度。
innodb_buffer_pool_size 是InnoDB性能的决定性因素,如果数据库大小小于innodb_buffer_pool_size设置的缓冲池大小,此时数据库的性能是最好的,因为客户端访问的数据都在内存里。
问题:
InnoDB_Buffer_Pool缓冲池复制管理着free list(初始化空闲页,为每一个page指定一个block头结构,并初始化各种mutex与rw-lock,将page加入Buffer_Pool的free list链表,等待分配)、flush list(缓冲池产生的脏页(数据库被修改,但未写入磁盘),当innodb_max_dirty_pages_pct超过设置的值时,会把修改时间较早的page刷入磁盘)、LRU(在内存中但最近又不用的数据块,按照最近最少使用算法,MYSQL会根据哪些数据属于LRU而将其移除内存,从而腾出空间来加载另外的数据)等。
当Innodb_Buffer_Pool缓冲池达到好几十G时,如果某个线程正在更新缓冲池,将会造成其他线程必须等待的瓶颈。
方案:
可以通过innodb_buffer_pool_instances参数来增加InnoDB_Buffer_Pool实例的个数,并使用哈希函数将读取缓存的数据页随机分配到一个缓冲池里面,这样每个缓冲区实例就可以分别管理着自己的free list 、flush lis、LRU,也就可以解决问题。
可以通过参数innodb_buffer_pool_size必须大于1GB时,生成InnoDB_Buffer_Pool多实例才有效,最多支持64个InnoDB_Buffer_Pool实例
参数:
innodb_buffer_pool_instances=3
调整完后可以用命令 show engine innodb status\G;来查看