For systems with buffer pools in the multi-gigabyte range,
dividing the buffer pool into separate instances can improve
concurrency, by reducing contention as different threads read
and write to cached pages. This feature is typically intended
for systems with a buffer
pool size in the multi-gigabyte range. Multiple buffer
pool instances are configured using the
innodb_buffer_pool_instances
configuration option, and you might also adjust the
innodb_buffer_pool_size
value.
When the InnoDB
buffer pool is large, many
data requests can be satisfied by retrieving from memory. You
might encounter bottlenecks from multiple threads trying to
access the buffer pool at once. You can enable multiple buffer
pools to minimize this contention. Each page that is stored in
or read from the buffer pool is assigned to one of the buffer
pools randomly, using a hashing function. Each buffer pool
manages its own free lists, flush lists, LRUs, and all other
data structures connected to a buffer pool. Prior to MySQL 8.0,
each buffer pool was protected by its own buffer pool mutex. In
MySQL 8.0 and later, the buffer pool mutex was replaced by
several list and hash protecting mutexes, to reduce contention.
To enable multiple buffer pool instances, set the
innodb_buffer_pool_instances
configuration
option to a value greater than 1 (the default) up to 64 (the
maximum). This option takes effect only when you set
innodb_buffer_pool_size
to a size of 1GB or
more. The total size you specify is divided among all the buffer
pools. For best efficiency, specify a combination of
innodb_buffer_pool_instances
and innodb_buffer_pool_size
so
that each buffer pool instance is at least 1GB.
For information about modifying InnoDB
buffer
pool size, see Section 17.8.3.1, “Configuring InnoDB Buffer Pool Size”.