MySQLのtable_open_cacheについて

とある日、MySQLにてクエリが溜まる事象が発生。

うーん、スロークエリにも結構出力されており、INDEXにも原因があるようだが、
データ件数がそこまで多くないので、他にも原因がありそう ということで調査を続行。

「SHOW GLOBAL STATUS \G」にてMySQLの各種ステータス情報を確認したところ、
Opened_tablesの値が大変なことに。。。。

mysql> SHOW GLOBAL STATUS LIKE ‘Opened_tables’;
+—————+———-+
| Variable_name | Value |
+—————+———-+
| Opened_tables | 4644624 |
+—————+———-+

table_open_cache値が小さかったことにより、テーブルキャッシュがうまく使われていないことも原因でした。OSのファイルディスクリプタの上限 と table_open_cache値を大きくし、クエリの滞留も解消されました。
めでたし、めでたし。

下記、table_open_cacheについて、まとめます。

【table_open_cache】

■説明
・テーブルキャッシュに保持できる上限値。
■注意事項
・OSのファイルディスクリプタの上限にも関係します。
・max_connectionsと関係する。
・設定値を大きくすると使用メモリ量も増える。
・MyISAMストレージエンジンでは1つのテーブルごとに2つのファイルディスクリプタが必要。
■チューニングポイント

  1. 「SHOW GLOBAL VARIABLES LIKE ‘table_open_cache’;」にて、table_open_cacheの値を確認する。
  2. 「SHOW GLOBAL STATUS LIKE ‘Opened_tables’;」にて、Opened_tablesの値を確認する。
  3. 判定する。
    判定条件:「Opened_tables」の値が、「table_open_cache」の値よりも大きくなっているか否か。

※「table_open_cache」の値が小さいと 新たにオープンするテーブルの数が増えるので 「Opened_tables」の値が増えます。

⇒ 「Opened_tables」の値が大きい場合は、table_open_cacheの値を増やしてください。

設定する推奨値 : max_connections * 1クエリで使用する最大テーブル数

※「table_open_cache」の値を変更する際は、下記に問題がないことを確認してください。

・メモリに空きがあること。

・OSのファイルディスクリプタの上限に問題がないこと。

投稿者プロフィール

ito
プログラマー、DBエンジニアを経て、2013年9月よりスカイアーチネットワークスに在籍しております。

現在、サーバ・ネットワークいろいろと奮闘中です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

プログラマー、DBエンジニアを経て、2013年9月よりスカイアーチネットワークスに在籍しております。 現在、サーバ・ネットワークいろいろと奮闘中です。