mysqladmin status コマンドを実行すると、次のように表示されるはずです。
Uptime: 426 Running threads: 1 Questions: 11082
Reloads: 1 Open tables: 12
テーブルが 6 つしかない場合に、12 の Open tables
値はいくぶん不可解に思うことがあります。
MySQL はマルチスレッド対応であるため、特定のテーブルに対して多くのクライアントが同時にクエリーを発行している場合があります。同じテーブルに対して、複数のクライアントセッションが異なる状態を持つ問題を最小にするため、テーブルは各同時セッションに独立して開かれます。これは追加メモリーを使用しますが、一般にパフォーマンスは向上します。MyISAM
テーブルでは、テーブルを開いているクライアントごとに、データファイルに 1 つの追加のファイルディスクリプタが必要になります。(対照的に、インデックスファイルディスクリプタはすべてのセッションで共有されます。)
table_open_cache
および max_connections
システム変数は、サーバーが開いたままにするファイルの最大数に影響します。これらの値のいずれかまたは両方を増やすと、オープンファイルディスクリプタのプロセスあたりの数に関して、オペレーティングシステムによって適用されている制限に達する可能性があります。多くのオペレーティングシステムでは、オープンファイル制限を増やすことができますが、方法はシステムによって大きく異なります。制限値を増やすことができるかどうか、およびその実行方法については、使用するオペレーティングシステムのドキュメントを参照してください。
table_open_cache
は max_connections
に関連します。たとえば、200 の同時実行接続の場合、少なくとも 200 *
のテーブルキャッシュサイズを指定します。ここで N
N
は実行するクエリーの結合あたりのテーブルの最大数です。また、一時テーブルとファイル用のいくつかの追加のファイルディスクリプタを予約する必要もあります。
オペレーティングシステムで、table_open_cache
の設定に示されたオープンファイルディスクリプタの数を処理できることを確認してください。table_open_cache
の設定が大きすぎると、MySQL がファイルディスクリプタを使い果たして接続を拒否し、クエリーの実行に失敗して、信頼性が大幅に低下します。また、MyISAM
ストレージエンジンでは一意のオープンテーブルごとに 2 つのファイルディスクリプタが必要であることも考慮に入れる必要があります。mysqld に --open-files-limit
スタートアップオプションを使用すると、MySQL で使用可能なファイルディスクリプタの数を増やすことができます。セクションB.5.2.18「'File' が見つかりません、および同様のエラー」を参照してください。
オープンテーブルのキャッシュは、table_open_cache
エントリのレベルで保持されます。サーバーはスタートアップ時にキャッシュサイズを自動サイズ設定します。サイズを明示的に設定するには、スタートアップ時に table_open_cache
システム変数を設定します。MySQL は、クエリーを実行するために、一時的にこれより多くのテーブルを開くことがあります。
次の状況では、MySQL は未使用のテーブルを閉じ、それをテーブルキャッシュから削除します。
キャッシュがいっぱいで、スレッドがキャッシュにないテーブルを開こうとした場合。
キャッシュに
table_open_cache
を超えるエントリがあり、キャッシュ内のテーブルがどのスレッドによっても使用されなくなった場合。テーブルフラッシュ操作が行われた場合。これは、だれかが
FLUSH TABLES
ステートメントを発行するか、または mysqladmin flush-tables または mysqladmin refresh コマンドを実行した場合に行われます。
テーブルキャッシュがいっぱいになると、サーバーは次の手順に従って使用するキャッシュエントリを見つけます。
現在使用中でないテーブルは、もっとも長く使用されていないテーブルから、解放されます。
新しいテーブルを開く必要があるが、キャッシュがいっぱいで、解放できるテーブルがない場合、必要に応じてキャッシュが一時的に拡張されます。キャッシュが一時的に拡張された状況で、テーブルが使用中から未使用状態になったときは、そのテーブルが閉じられ、キャッシュから解放されます。
MyISAM
テーブルは同時アクセスごとに開かれます。つまり、2 つのスレッドで同じテーブルにアクセスする場合、または 1 つのスレッドが同一クエリーでテーブルに 2 回アクセスする場合 (テーブルをそれ自体に結合することによってなど) は、テーブルを 2 回開く必要があることを意味します。同時オープンは、それぞれテーブルキャッシュにエントリが必要になります。いずれかの MyISAM
テーブルを最初に開くと、データファイルに 1 つとインデックスファイルに 1 つの 2 つのファイルディスクリプタが必要になります。テーブルの追加の使用では、それぞれデータファイルに 1 つだけのファイルディスクリプタが必要です。インデックスファイルディスクリプタはすべてのスレッドで共有されます。
HANDLER
ステートメントを使用してテーブルを開く場合、専用のテーブルオブジェクトがスレッドに割り当てられます。このテーブルオブジェクトはほかのスレッドと共有されず、スレッドが tbl_name
OPENHANDLER
を呼び出すか、スレッドが終了するまでクローズされません。これが発生すると、テーブルがテーブルキャッシュに戻されます (キャッシュがいっぱいでない場合)。セクション13.2.4「HANDLER 構文」を参照してください。
tbl_name
CLOSE
テーブルキャッシュが小さすぎるかどうかは、mysqld のステータス変数 Opened_tables
をチェックして判断できます。これは、サーバーの起動以降のテーブルを開く操作の数を示します。
mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
多くの FLUSH TABLES
ステートメントを発行していない場合でも、値がきわめて大きいか、急増した場合、テーブルキャッシュサイズを増やします。セクション5.1.4「サーバーシステム変数」およびセクション5.1.6「サーバーステータス変数」を参照してください。