MySQLのバッファプール ヒット率の計算方法は?

MySQLのバッファプールのヒット率

Oracleの場合、バッファキャッシュヒット率のSQLが色々なところに公開されていて、SQLを投げればすぐに取得できますが、MySQLのInnoDBバッファプールのヒット率は今ひとつどこを見ればいいかわからないと思います。
DBではバッファのヒット率は重要で、ディスクの読み込みは少しでも少ないほうがよいですからこの数値が気になる人は多いはずです。またヒット率をもってInnoDB_buffer_pool_sizeが足りているのかを判断することもあるでしょう。

innodb statusの結果

一番わかりやすそうなのは、Innodbのことなのでshow engine innodb statusを見ることでしょう。

mysql>show engine innodb status¥G;
・・・・中略・・・・
BUFFER POOL AND MEMORYの項目
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

 

ここで記載されているBuffer pool hit rateは1000/1000や998/1000程度になっていることが多いです。998/1000ということはほぼ100%ということなのか、これがどのような計算式で計算されているのか今ひとつわからないかもしれません。
しかもshow engine innodb statusの数値はMySQLが起動してからの累積値なので、計算式がわからないと現在のヒット率を求めることはできません。

一番わかりやすいバッファヒット率の計算方法

結局、Innodb Bufferpoolのヒット率はshow global statusで調査するして計算するのがわかりやすいでしょう。

Zabbixやその他の監視ツールを利用した場合、プラグインによってはhow engine innodb statusの方を取得しているものもありますが、以下の計算式でヒット率を
出しているものもあるようです。

 

mysql> show global status like 'Innodb_buffer_pool%;
Innodb_buffer_pool_read_requests 12293984
Innodb_buffer_pool_reads 24043

それぞれの結果の意味は以下のとおりです。

Innodb_buffer_pool_read_requests = InnoDB が行った論理読み込みの数
Innodb_buffer_pool_reads = InnoDBがバッファプールの内容を利用できず、シングルページ読み込みを行わなければならなかった論理読み込みの回数

ちょっとわかりづらいですが、InnoDBがおこなった論理数とディスクから読み込まなければならなかった数がわかるので、これでバッファプールから読み込んだ率が計算できます。

バッファプールヒット率の計算式

(1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)) ×100

上記の例だと

(1-(24043/12293984))*100 = 99.80% となりますね。
ただしこれはその他の事例同様に起動してからの累積値ですので、一定期間での差分を取得して率を計算しないとバッファプールヒット率の推移などは算出できません。

手動で計算するのは難しいため、監視ツールのスクリプトやプラグインなどで対応するか自分でスクリプトを作成するのがよいでしょう。
githubで取得用のスクリプトなども公開されているので、それを利用してもよいかもしれません。

タイトルとURLをコピーしました