mysqladmin status を実行すると、次の出力が表示されます。
Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12
テーブルが 6 つしかない場合に
Open tables
値が 12
と表示されることに、当惑する場合もあります。
MySQL is MySQL
はマルチスレッド化されているため、多数のクライアントが同時に同じものに対してクエリーを使用することがあります。複数クライアントセッションが同一テーブルに対して異なる状態を持つことに伴う問題を少しでも少なくするため、テーブルはセッションごとに別々に開かれます。これはメモリーの消費を増やしますが、一般にパフォーマンスは向上します。MyISAM
テーブルの場合は、テーブルを開いたそれぞれのクライアントにデータファイルに対するファイル記述子が必要になります。これに対し、インデックスファイルに対するファイル記述子はすべてのセッションで共有されます。
table_open_cache
は、MySQL 5.1.2 以前は
table_cache
と呼ばれていました。
table_open_cache
、max_connections
、および
max_tmp_tables
サーバー変数は、サーバーが開いた状態で保持できるファイルの最大数に影響します。これらの値の
1 つ以上を増加すると、OS
によって制限されている 1
プロセスが持つことができるファイル記述子の最大数まで実行が可能になります。システムごとに方法は多様ですが、多数のオペレーティングシステムでオープンファイルの制限値を上げることができます。制限値の拡大が可能かどうかの判定、およびその実行方法については、使用するオペレーティングシステムの文書を参照してください。
table_open_cache
は
max_connections
と関係します。たとえば、同時接続数が 200
の場合、最低 200 ×
のテーブルキャッシュサイズを用意するようにします。この
N
N
は結合で使用するテーブル数の最大値を示します。また、一時テーブルとファイル用のファイル記述子も必要です。
あなたのオペレーティングシステムが
table_open_cache
の設定に従ったファイル記述子の数を処理できることを確認してください。table_open_cache
の設定が高すぎると、MySQL
がファイル記述子を使い果たして接続を拒否し、クエリーの実行ができなくなり、信頼性が大幅に低下します。また、MyISAM
ストレージエンジンでは 1 つのテーブルごとに
2
つのファイル記述子が必要であることも考慮に入れる必要があります。--open-files-limit
スタートアップオプションを使用すると、mysqld
で使用可能なファイル記述子数を拡大できます。'File
' Not Found and Similar Errors
を参照してください。
オープンテーブルのキャッシュは、table_open_cache
エントリレベルに保持されます。デフォルト値は
64
です。これは、--table_open_cache
オプション
mysqld
に与えることで変更できます。MySQL
は一時的にさらに多くのテーブルを開いてクエリーを実行することがあります。
次の状況では、MySQL は使用されていないテーブルが閉じられ、テーブルキャッシュから削除されます。
キャッシュが満杯のときに、キャッシュにないテーブルをスレッドが開こうとした場合。
キャッシュに
table_open_cache
を超えるエントリがあり、あるスレッドがテーブルの使用を終えた場合。
テーブルフラッシュオペレーションが起きたとき。いずれかのユーザーが
FLUSH
TABLES
、mysqladmin
flush-tables または
mysqladmin refresh
を実行した場合。
テーブルキャッシュが満杯になると、サーバーでは次の手順に従って使用するキャッシュエントリを割り当てます。
現在使用中でないテーブルは、最後に使用したときが古いものから順にリリースされる。
キャッシュが満杯でリリース可能なテーブルがなく、新たにテーブルを開く必要がある場合は、必要に応じてキャッシュが一時的に拡張される。キャッシュが一時的に拡張された状況で、使用中のテーブルが使用されなくなったときは、そのテーブルが閉じられ、キャッシュからリリースされる。
MyISAM
テーブルは同時アクセスのそれぞれで開かれます。つまり、2
つのスレッドで同じテーブルにアクセスする場合、または
1 つのスレッドが同一クエリーでテーブルに 2
回アクセスする場合
(テーブルを同一テーブルに結合する場合など)
は、テーブルを 2
回開く必要があることになります。同時オープンには、それぞれテーブルキャッシュにエントリが必要になります。いずれかの
MyISAM
テーブルを最初に開く際に、2
つのファイル記述子が割り当てられます。1
つはデータファイルの記述子、もう 1
つはインデックスファイルの記述子です。最初のオープン時の
2
つめの記述子は、インデックスファイルに使用され、この記述子はすべてのスレッドで共有されます。インデックスファイルの記述子はすべてのスレッドで共有されます。
HANDLER
ステートメントを使用してテーブルを開く場合は、専用のテーブルオブジェクトがスレッドに割り当てられます。このテーブルオブジェクトはほかのスレッドと共有されず、スレッドが
tbl_name
OPENHANDLER
を呼び出すか、スレッドが終了するまで閉じられません。この場合はテーブルがテーブルキャッシュに戻されます
(キャッシュが満杯でない場合)。項8.2.4. 「tbl_name
CLOSEHANDLER
構文」
を参照してください。
テーブルキャッシュが小さすぎるかどうかは、mysqld
のステータス変数
Opened_tables
で確認できます。この変数は、サーバーの起動以降に実行されたテーブルを開く操作の数を示します。
mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
たとえ多くの
FLUSH
TABLES
を実行していない場合でも、この値が非常に大きい場合や急速に大きくなる場合は、テーブルキャッシュサイズを拡張するようにしてください。Server System Variables、Server Status Variables
を参照してください。