mysqladmin statusを実行すると、以下の出力が表示されます。
Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12
テーブルが 6 つしかない場合に Open
tables
値が 12
と表示されることに、当惑する場合もあります。
MySQL is MySQL
はマルチスレッド化されているため、多数のクライアントが同時に同じものに対してクエリを使用することがあります。2
つのクライアントスレッドで 1
つのファイルに異なるステータスが発生する問題を最小にするため、同時に実行しているスレッドがそれぞれで無関係にテーブルを開きます。これはメモリの消費を増やしますが、一般にパフォーマンスは向上します。MyISAM
テーブルの場合は、テーブルを開いたそれぞれのクライアントにデータファイルに対するファイル記述子が必要になります。このテーブル型では、インデックスファイルに対するファイル記述子がすべてのスレッドで共有されます。
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で使用可能なファイル記述子数を拡大できます。
.項B.1.2.17. 「'File
' Not Found and
Similar Errors」を参照してください。
オープンテーブルのキャッシュは、table_open_cache
エントリレベルに保持されます。デフォルト値は
64
です。これは、--table_open_cache
オプション
mysqld
に与えることで変更できます。mysqldは一時的にさらに多くのテーブルを開いてクエリの実行を実現することがあります。
MySQL Enterprise.
table_cache
設定が低すぎると、パフォーマンスに悪影響を及ぼします。この変数の最適値に関する詳しいアドバイスについては、MySQL
Network Monitoring and Advisory
Serviceを購読してください。追加情報については
http://www-jp.mysql.com/products/enterprise/advisors.htmlを参照してください。
以下の状況では、MySQLは使用されていないテーブルが閉じられ、テーブルキャッシュから削除されます。
キャッシュが満杯のときに、キャッシュにないテーブルをスレッドが開こうとした場合。
キャッシュに
table_open_cache
を超えるエントリがあり、あるスレッドがテーブルの使用を終えた場合。
テーブルフラッシュオペレーションが起きたとき。いずれかのユーザが
FLUSH TABLES
、mysqladmin
flush-tablesまたは mysqladmin
refreshを実行した場合。
テーブルキャッシュが満杯になると、サーバでは以下の手順に従って使用するキャッシュエントリを割り当てます。
現在使用中でないテーブルは、最後に使用した時が古いものから順にリリースされる。
キャッシュが満杯でリリース可能なテーブルがなく、新たにテーブルを開く必要がある場合は、必要に応じてキャッシュが一時的に拡張される。
キャッシュが一時的に拡張された状況で、使用中のテーブルが使用されなくなったときは、そのテーブルが閉じられ、キャッシュからリリースされる。
テーブルは同時アクセスのそれぞれで開かれます。つまり、2
つのスレッドで同じテーブルにアクセスする場合、または
1 つのスレッドが同一クエリでテーブルに 2
回アクセスする場合(テーブルを同一テーブルに結合する場合など)は、テーブル
を 2 回開く必要があることになります。
いずれかのMyISAM
テーブルを最初に開く際に2
つのファイル記述子が割り当てられ、その後さらにそのテーブルを使用する場合はファイル記述子が
1
つのみ割り当てられます。最初のオープン時の
2
つめの記述子は、インデックスファイルに使用され、この記述子はすべてのスレッドで共有されます。
HANDLER
ステートメントを使用してテーブルを開く場合は、専用テーブルオブジェクトがスレッドに割り当てられます。
このテーブルオブジェクトは他のスレッドと共有されず、スレッドが
tbl_name
OPENHANDLER
を呼び出すか、スレッドが終了するまで閉じられません。この場合はテーブルがテーブルキャッシュに戻されます(キャッシュが満杯でない場合)。
項12.2.3. 「tbl_name
CLOSEHANDLER
構文」を参照してください。
テーブルキャッシュが小さすぎるかどうかは、mysqldの
Opened_tables
変数のチェックで確認できます。
mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
たとえ多くの FLUSH
TABLES
を実行していない場合でも、この値が非常に大きい場合は、テーブルキャッシュサイズを拡張する必要があります。
項4.2.3. 「システム変数」、項4.2.5. 「ステータス変数」
を参照して下さい。