bigmac-jp blog

web開発関連のメモ

MySQL メモ3 InnoDB最低限の設定(バッファープールサイズ)

バッファープール

InnoDBでは登録されているデータとIndexをメモリ上にキャッシュすることで、ディスクへのI/Oを抑える仕組みがある。データとIndexをバッファープールと呼ばれる領域にキャッシュさせることが、チューニングの第一歩となる。

理想的には、バッファープールのサイズをできるだけ大きな値に設定して、サーバー上のほかのプロセスが過剰なページングなく実行するように、十分なメモリーを残します。バッファープールが大きいほど、InnoDB はさらにインメモリーデータベースのように動作し、ディスクから 1 回データを読み取り、後続の読み取り時に、メモリーからデータにアクセスします。
出典:MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.9.1 InnoDB バッファープール

バッファープールサイズは、登録済みデータとIndexの合計以上の値を設定した場合に、
すべてのデータとIndexがキャッシュされるためパフォーマンスが向上する。

MySQLの公式に記載されている通り、バッファープールサイズの値は大きければいいのだが、
使えるメモリには制限があるので、適切な値を算出する必要がある。

下記の記事で記載されているSQLで算出が可能。

https://dba.stackexchange.com/questions/27328/how-large-should-be-mysql-innodb-buffer-pool-size


測定ツールを使える場合は、"MySQL Tuner"が便利です。
下記のような測定値が計測可能です。

-------- InnoDB Metrics ----------------------------------------------------------------------------
[--] InnoDB is enabled.
[--] InnoDB Thread Concurrency: 0
[OK] InnoDB File per table is activated
[OK] InnoDB buffer pool / data size: 896.0M/446.5M
[OK] Ratio InnoDB log file size / InnoDB Buffer pool size: 100.0M * 2/896.0M should be equal to 25%
[OK] InnoDB buffer pool instances: 1
[--] Number of InnoDB Buffer Pool Chunk : 7 for 1 Buffer Pool Instance(s)
[OK] Innodb_buffer_pool_size aligned with Innodb_buffer_pool_chunk_size & Innodb_buffer_pool_instances
[!!] InnoDB Read buffer efficiency: -33.57% (-466 hits/ 1388 total)
[!!] InnoDB Write Log efficiency: 0% (2 hits/ 0 total)
[OK] InnoDB log waits: 0.00% (0 waits / 2 writes)


データ量は日々増えていくものなので、定期的にバッファープールサイズに不足がないことは確認が必要。


お金はたくさんあるけど、バッファープールサイズの適正値を調べる時間がない人は、
DB専用のサーバを用意してメモリを最大限積んで、メモリの80%の値を設定すればOK。