個々のクエリを維持するためのいくつかの技術は、高速で多くのテーブル間で分割データを伴います。テーブルの数が数千または数百万もの中に実行すると、すべてのこれらのテーブルを扱うのオーバーヘッドは、新しいパフォーマンスの考慮事項となります。
あなたが実行するとmysqladminのステータスコマンドを、あなたはこのように表示されます。
アップタイム:426件の実行中のスレッド:1つの質問:11082の リロード:1つのオープンテーブル:12
Open tables
12の値は、12の未満のテーブルを持っている場合は、やや不可解なことができます。
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つのファイル記述子を必要とします。パーティションについてMyISAM
の表、2つのファイル記述子が開かれたテーブルの各パーティションに必要とされます。(ときにMyISAM
パーティションテーブルを開き、それが特定のパーティションが実際に使用されているかどうか、この表のすべてのパーティションを開きます。参照MyISAMテーブルとパーティションのファイルディスクリプタの使用率が。)設定のMySQLが利用できるファイル記述子の数増やすにはopen_files_limit
、システム変数を。参照節B.4.2.17、「ファイルが見つかりませんと同様のエラー」。
オープンテーブルのキャッシュは、のレベルに保たれているtable_open_cache
エントリ。サーバは、起動時にキャッシュサイズをautosizes。明示的にサイズを設定するには、設定table_open_cache
、起動時にシステム変数を。このクエリを実行するよりも、このセクションで後述するように、MySQLは一時的に、複数のテーブルを開くことができます。
MySQLは、未使用のテーブルを閉じ、次のような状況下で、テーブルキャッシュから削除されます:
-
キャッシュがいっぱいで、スレッドがキャッシュにないテーブルを開こうとすると。
-
キャッシュは、より多く含まれていない場合は
table_open_cache
エントリをキャッシュ内のテーブルは、もはや任意のスレッドによって使用されています。 -
ときに、テーブルのフラッシュ操作が発生しました。誰かが発行したときにこれが起こる
FLUSH TABLES
のステートメントを実行したりmysqladminのフラッシュ・テーブルまたはmysqladminはリフレッシュコマンドを。
テーブルキャッシュがいっぱいになると、サーバが使用するキャッシュエントリを検索するには、次の手順を使用しています:
-
テーブルには、現在使用中の最低使用テーブルから始まる、解放されません。
-
新しいテーブルを開いておく必要がありますが、キャッシュがいっぱいになると何もテーブルが解放できない場合は、キャッシュが一時的に必要に応じて拡張されます。キャッシュが一時的に拡張状態にあり、テーブルが未使用の状態に使用から移行すると、テーブルが閉じられ、キャッシュから解放されます。
MyISAM
テーブルは各同時アクセス用に開かれています。2つのスレッドが同じテーブルにアクセスする場合、またはスレッドが(例えば、それ自体にテーブルを結合することによって)同じクエリで二回表にアクセスする場合、テーブルが必要とこの手段は、二回開かれます。各同時オープンは、テーブルキャッシュにエントリが必要です。いずれかの最初のオープンMyISAM
データファイルに対して1つのインデックスファイルのための1:表には2つのファイル記述子を取ります。テーブルの各付加的な使用は、データファイルのための唯一のファイルディスクリプタをとります。インデックスファイルディスクリプタは、すべてのスレッド間で共有されます。
あなたがテーブルを開いている場合のステートメントは、専用テーブルオブジェクトがスレッドに割り当てられます。このテーブルオブジェクトは他のスレッドで共有されていないと、スレッドの呼び出しまで閉じていないか、スレッドが終了します。このような場合(キャッシュが満杯でない場合)、テーブルがテーブルキャッシュに戻されます。参照13.2.4項、「HANDLERステートメント」。HANDLER
tbl_name
OPENHANDLER
tbl_name
CLOSE
あなたのテーブルキャッシュが小さすぎるかどうかを判断するには、チェックOpened_tables
サーバが起動してから、テーブルの開操作の数を示すステータス変数を、:
MySQLの> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+ --------------- + ------- +
| 変数名| バリュー|
+ --------------- + ------- +
| Opened_tables | 2741 |
+ --------------- + ------- +
値が非常に大きいか、あなたは多く発行されていない場合でも、急激に増加した場合はFLUSH TABLES
ステートメントを、増加table_open_cache
サーバーの起動時に値を。
あなたは多くの持っている場合はMyISAM
、同じデータベース・ディレクトリ、オープン、クローズのテーブルを、および作成操作が遅いです。あなたが実行した場合SELECT
、多くの異なるテーブルの上に文をテーブルキャッシュがいっぱいになったとき、少しのオーバーヘッドが原因で開かれていないすべてのテーブルのために、そこにある、もう一つは閉じていなければなりません。あなたは、テーブルキャッシュで許可エントリの数を増やすことで、このオーバーヘッドを削減することができます。