MySQL 5.1 リファレンスマニュアル :: 6 最適化 :: 6.4 データベース構造の最適化 :: 6.4.8 MySQL でのテーブルのオープンとクローズの方法
« 6.4.7 MyISAMインデックス統計コレクション

6.4.9 1 つのデータベースに大量のテーブルを作成した場合の欠点 »
Section Navigation      [Toggle]
  • 6.4 データベース構造の最適化
  • 6.4.1 設計上の選択
  • 6.4.2 データの小型化
  • 6.4.3 カラムインデックス
  • 6.4.4 複合インデックス
  • 6.4.5 MySQLにおけるインデックスの使用
  • 6.4.6 MyISAMキーキャッシュ
  • 6.4.7 MyISAMインデックス統計コレクション
  • 6.4.8 MySQL でのテーブルのオープンとクローズの方法
  • 6.4.9 1 つのデータベースに大量のテーブルを作成した場合の欠点

6.4.8. MySQL でのテーブルのオープンとクローズの方法

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 OPENステートメントを使用してテーブルを開く場合は、専用テーブルオブジェクトがスレッドに割り当てられます。 このテーブルオブジェクトは他のスレッドと共有されず、スレッドが HANDLER tbl_name CLOSEを呼び出すか、スレッドが終了するまで閉じられません。この場合はテーブルがテーブルキャッシュに戻されます(キャッシュが満杯でない場合)。 項12.2.3. 「HANDLER 構文」を参照してください。

テーブルキャッシュが小さすぎるかどうかは、mysqldの Opened_tables変数のチェックで確認できます。

mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741  |
+---------------+-------+

たとえ多くの FLUSH TABLESを実行していない場合でも、この値が非常に大きい場合は、テーブルキャッシュサイズを拡張する必要があります。 項4.2.3. 「システム変数」、項4.2.5. 「ステータス変数」 を参照して下さい。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates