MySQLのテーブルキャッシュに関して、まとめました。
ちなみに全てInnDBを想定しています。
https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_table_open_cache
https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_table_definition_cache
まず、MySQLのテーブルキャッシュは2種類存在する。
1. 通常のテーブルキャッシュ(table_open_cache)
・table_open_cache 変数で設定する
・同時に「オープン」できるテーブル数を設定できる
・キャッシュする対象は、テーブルのファイルディスクリプタ
・「テーブルキャッシュ」=「mysqldプロセスがメモリ上に保持するファイルディスクリプタの数」
・「table_open_cacheの引き上げ」=「同時に開けるテーブル数増加」
=「mysqldプロセスが要求するファイルディスクリプタの上限値引き上げ」
・ただし、OS側がmysqldプロセスに対して許可するファイルディスクリプタ上限は、「open_files_limit」変数で規定する必要がある
→ table_open_cache をかなり大きな値にする場合は、open_files_limit の設定にも注意
2. テーブル定義キャッシュ(table_definition_cache)
・table_definition_cache 変数で設定する
・テーブル定義(.frmファイル)をキャッシュする
・テーブル定義をキャッシュすることでテーブルを開くとき高速化できる
2つのテーブルキャッシュの違い
・テーブル定義キャッシュは、標準のテーブルキャッシュと異なり、占有スペースが少なくファイルディスクリプタを使用しない
・ただし、テーブルキャッシュもファイルディスクリプタしかキャッシュしていないので、そもそもメモリを余り消費しない
・テーブルのデータサイズの影響も受けない(キャッシュ対象がファイルディスクリプタ or テーブル定義だから)
→ データ/インデックスのキャッシュはバッファプール