バッファープールが数 G バイトの範囲にあるシステムでは、バッファープールを個別のインスタンスに分割すると、キャッシュされたページに対して異なるスレッドが読み取りおよび書き込みを行うときの競合が減るため、並列性が向上する場合があります。 この機能は通常、バッファープールのサイズが数 G バイトの範囲にあるシステムを対象にしています。 複数のバッファープールインスタンスは innodb_buffer_pool_instances
構成オプションを使用して構成され、また innodb_buffer_pool_size
値を調整することもできます。
InnoDB
バッファプールが大きい場合、メモリーから取得することで多くのデータリクエストを満たすことができます。 複数のスレッドが一度にバッファープールにアクセスしようとした場合は、ボトルネックが発生する可能性があります。 この競合を最小限に抑えるために、複数のバッファープールを有効にすることができます。 バッファープールに格納されるか、またはバッファープールから読み取られる各ページは、ハッシュ関数を使用して、いずれかのバッファープールにランダムに割り当てられます。 各バッファプールは、バッファプールに接続されている独自の空きリスト、フラッシュリスト、LRU およびその他のすべてのデータ構造を管理します。 MySQL 8.0 より前は、各バッファープールは独自のバッファープール相互排他ロックによって保護されていました。 MySQL 8.0 以降では、競合を減らすために、バッファープール mutex が複数のリストおよびハッシュ保護 mutex に置き換えられました。
複数のバッファープールインスタンスを有効にするには、innodb_buffer_pool_instances
構成オプションを 1 (デフォルト) より大きく 64 (最大) までの値に設定します。 このオプションは、innodb_buffer_pool_size
を 1GB 以上のサイズに設定した場合にのみ有効になります。 指定した合計サイズは、すべてのバッファープール間で分割されます。 最高の効率を得るには、innodb_buffer_pool_instances
と innodb_buffer_pool_size
の組み合わせを、各バッファープールインスタンスが少なくとも 1G バイトになるように指定します。
InnoDB
バッファープールサイズの変更については、セクション15.8.3.1「InnoDB バッファプールサイズの構成」 を参照してください。