ブログ - MySQLのkey_buffer_sizeを考える
インデックス検索されている場合は,インデックスはkey_buffer_sizeで指定されたメモリに展開されるので,最適な容量を考えてみる.
ということで,まず,全てのインデックスがメモリに乗るのかどうかを調べるため,インデックスのサイズを計算してみる.
このSQLは実行した時に選択されているデータベースに対してのインデックスサイズの総量です.単位はバイト数.これだと6MBなので余裕だな...
現在使っているKey_bufferを確認してみる.
1ブロックはデフォルトでは1024バイトなのだけれど一応確認してみる.
2382×1024=2,439,168byte=2.3MBでした.
現在の設定はこんな感じ.
256MBなので,これはメモリの無駄遣い.減らしましょう.10MBもあれば十分か.
キーのキャッシュヒット率を計算してみる.
キャッシュヒット率は次の式で計算.
あてはめてみる.
そりゃぁもう割り当てメモリ多すぎなので当然と言えば当然の結果.
今回,256MBから12MBに変更してみる.
ということで,まず,全てのインデックスがメモリに乗るのかどうかを調べるため,インデックスのサイズを計算してみる.
mysql> select sum(index_length) from information_schema.tables where table_schema=database();
+-------------------+
| sum(index_length) |
+-------------------+
| 6331392 |
+-------------------+
1 row in set (0.01 sec)
mysql>
現在使っているKey_bufferを確認してみる.
mysql> show status like "Key_blocks%";
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 229578 |
| Key_blocks_used | 2382 |
+------------------------+--------+
3 rows in set (0.01 sec)
mysql>
mysql> SHOW VARIABLES LIKE 'key_cache_block_size';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| key_cache_block_size | 1024 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql>
現在の設定はこんな感じ.
mysql> SHOW VARIABLES LIKE 'key_buffer_size';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| key_buffer_size | 268435456 |
+-----------------+-----------+
1 row in set (0.00 sec)
mysql>
キーのキャッシュヒット率を計算してみる.
mysql> show status like "Key_read%";
+-------------------+---------+
| Variable_name | Value |
+-------------------+---------+
| Key_read_requests | 7587589 | ←キャッシュからの読み取り要求回数
| Key_reads | 242 | ←ディスクからの読み取り要求回数
+-------------------+---------+
2 rows in set (0.00 sec)
mysql>
100 - ( ( Key_reads / Key_read_requests ) * 100 )
100 - ( ( 242 / 7587589) * 100 ) = 99.999987%
今回,256MBから12MBに変更してみる.