通过设置多个BufferPool提升数据库并发处理能力

443 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

MySQL中Buffer Pool是比较重要的一块内存区域,在对数据做增删改查的时候都会先把数据从磁盘文件中加载到内存中进行操作,这样可以减少磁盘的IO,加快数据的查找。Buffer Pool实际就是一大块内存数据结构,由一大推缓存页和描述数据组成,然后有free链表,flush链表,lru链表来对缓存页进行各种控制。

如果MySQL收到多个请求,会采用多线程来处理这多个请求,当多个线程同时访问Buffer Pool时去操作里面的缓存页,同时操作链表就会对Buffer Pool进行加锁,然后让一个线程完成一系列操作后,才会释放锁,后续的线程才可以访问,这个时候就把多线程变成了串行化操作,一个个依次执行操作,这样的话,对数据库的性能会有很大的影响。 如果机器的内存比较大例如32GB,只是设置一个Buffer Pool 16GB,这样的话数据库的并发越高,数据冲突的可能就越大,这样的话数据库就会加更多的锁,会减少并发处理能力,可以对MySQL设置多个Buffer Pool来优化并发能力,给每个Buffer Pool设置2GB,这样的话就有8个Buffer Pool,可以将数据分配到不同的内存中,增大并发处理能力。MySQL默认规则:如果给Buffer Pool分配的内存小于1GB,那么最多就会给分配一个Buffer Pool。如果机器内存很大,肯定会给Buffer Pool分配较大的内存,可以通过下面设置:

[server]
innodb_buffer_pool_size = 8589934592
innodb_buffer_pool_instances = 4

Buffer Pool总设置8GB的内存,设置了4个buffer pool,也是说每个Buffer Pool的大小是2GB,这个时候MySQL运行的时候就有4个Buffer Pool,每个Buffer Pool负责管理一部分的缓存页和描述数据块,每个Buffer Pool有各自独立的free,flush,lru等链表。

image.png 当多个线程访问的时候,将不同的线程分散到不同的Buffer Pool中的之后,对多线程并发访问的性能就会得到很大的提升。