table_cache
、max_connections
、および
max_tmp_tables
サーバ変数は、サーバが開いた状態で保持できるファイルの最大数に影響します。
これらの値の 1 つ以上を増加すると、OS
によって制限されている 1
プロセスが持つことができるファイル記述子の最大数まで実行が可能になります。システムごとに方法は多様ですが、多数のオペレーティングシステムでオープンファイルの制限値を上げることができます。
制限値の拡大が可能かどうかの判定、およびその実行方法については、使用するオペレーティングシステムの文書を参照してください。
table_cache
は
max_connections
と関係します。たとえば、同時接続数が 200
の場合、最低 200 * n
のテーブルキャッシュサイズが必要です。この
n
は結合で使用するテーブル数の最大値を示します。また、テンポラリテーブルとファイル用のファイル記述子も必要です。
あなたのオペレーティングシステムが
table_cache
の設定に従ったファイル記述子の数を処理できることを確認してください。table_cache
の設定が高すぎると、MySQL
がファイル記述子を使い果たして接続を拒否し、クエリの実行ができなくなり、信頼性が大幅に低下します。また、MyISAM
ストレージエンジンでは1つのテーブルごとに 2
つのファイル記述子が必要であることも考慮に入れる必要があります。--open-files-limit=#
スタートアップオプションを使用すると、MySQL
で使用可能なファイル記述子数を拡大できます。
See 項A.2.17. 「File Not Found エラー」。
オープンテーブルのキャッシュは、table_cache
エントリレベルに保持されます。デフォルト値は
64 です。これは、-O table_cache=#
オプション mysqld
に与えることで変更できます。MySQL
は一時的にさらに多くのテーブルを開いてクエリの実行を実現することがあります。
以下の状況では、使用されていないテーブルが閉じられ、テーブルキャッシュから削除されます。
キャッシュが満杯のときに、キャッシュにないテーブルをスレッドが開こうとした場合。
キャッシュに table_cache
を超えるエントリがあり、あるスレッドがテーブルの使用を終えた場合。
いずれかのユーザが mysqladmin
refresh
または mysqladmin
flush-tables
を実行した場合。
いずれかのユーザが FLUSH TABLES
ステートメントを実行した場合。
テーブルキャッシュが満杯になると、サーバでは以下の手順に従って使用するキャッシュエントリを割り当てます。
現在使用中でないテーブルは、最後に使用した時が古いものから順にリリースされる。
キャッシュが満杯でリリース可能なテーブルがなく、新たにテーブルを開く必要がある場合は、必要に応じてキャッシュが一時的に拡張される。
キャッシュが一時的に拡張された状況で、使用中のテーブルが使用されなくなったときは、そのテーブルが閉じられ、キャッシュからリリースされる。
テーブルは同時アクセスのそれぞれで開かれます。つまり、2 つのスレッドで同じテーブルにアクセスする場合、または 1 つのスレッドが同一クエリでテーブルに 2 回アクセスする場合(テーブルを同一テーブルに結合する場合など)は、テーブル を 2 回開く必要があることになります。 いずれかのテーブルを最初に開く際に 2 つのファイル記述子が割り当てられ、その後さらにそのテーブルを使用する場合はファイル記述子が 1 つのみ割り当てられます。最初のオープン時の 2 つめの記述子は、インデックスファイルに使用され、この記述子はすべてのスレッドで共有されます。
HANDLER table_name OPEN
ステートメントを使用してテーブルを開く場合は、専用テーブルオブジェクトがスレッドに割り当てられます。
このテーブルオブジェクトは他のスレッドと共有されず、スレッドが
HANDLER table_name CLOSE
を呼び出すか、スレッドが終了するまで閉じられません。
See 項6.4.9. 「HANDLER
構文」。
この場合はテーブルがテーブルキャッシュに戻されます(キャッシュが満杯でない場合)。
テーブルキャッシュが小さすぎるかどうかは、mysqld
の Opened_tables
変数のチェックで確認できます。たとえ多くの
FLUSH TABLES
を実行していない場合でも、この値が非常に大きい場合は、テーブルキャッシュサイズを拡張する必要があります。
See 項4.6.8.3. 「SHOW STATUS
」。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.