Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  MySQL でのテーブルのオープンとクローズの方法

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

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

テーブルキャッシュが小さすぎるかどうかは、mysqld のステータス変数 Opened_tables をチェックして判断できます。これは、サーバーの起動以降のテーブルを開く操作の数を示します。

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

多くの FLUSH TABLES ステートメントを発行していない場合でも、値がきわめて大きいか、急増した場合、テーブルキャッシュサイズを増やします。セクション5.1.4「サーバーシステム変数」およびセクション5.1.6「サーバーステータス変数」を参照してください。


User Comments
  Posted by Robin Powell on July 7, 2005
The status variable "Flush_commands" will give you an idea of how often you run flushes.

-Robin
  Posted by Richard Bronosky on April 21, 2008
I think it is unclear what the difference between Open_tables and Opened_tables are. I will explain as I understand it, and I hope I will be corrected where I may be inaccurate.

Open_tables is a status variable indicating the number of file descriptors that are currently open by all running threads. When multiple threads access a single table simultaneously, multiple file descriptors are used. This makes it possible, and likely, that Open_tables exceeds the number of tables (SELECT COUNT(*) FROM information_schema.TABLES;) on your instance.

table_cache is a system variable the defines the number of file_descriptors that are allocated into a pool to be used for Open_tables as needed. When the MySQL threads need to open "greater than table_cache" number of tables, additional file descriptors are opened. Each time one of these additional file descriptors is opened, the status variable Opened_tables is incremented.

Opened_tables is a status variable that keeps a running tally of the number of additional file descriptors that have been allocated for opening tables at times when the available file descriptors in table_cache have been depleted. These files descriptors are released when demand subsides. There is no way of knowing what the maximum number used descriptors has been over time since the variable Opened_tables is the tally since the instance's Uptime.

It is not uncommon to see a value of 0 for Opened_tables. This simply means that the table_cache has never been exceeded.

Example :
> show status like 'Open%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files | 487 |
| Open_streams | 0 |
| Open_tables | 325 |
| Opened_tables | 0 |
+---------------+-------+
4 rows in set (0.01 sec)
> select @@table_cache;
+---------------+
| @@table_cache |
+---------------+
| 512 |
+---------------+
1 row in set (0.02 sec)
  Posted by Horst Pralow on May 19, 2008
The status variable 'Opened_tables' will also be incremented by 2 each time you create a temporary table.

Thus if you are using temporary tables, a large value in the global status varaiable 'Opened_tables' does not necessarily indicate that your table_cache value is too small, and increasing table_cache will not stop Opened_tables growing.

  Posted by Jay Maran on February 14, 2009
Note the difference between the global value of Opened_tables and the session value. Typically, you want the global value.

mysql> show status like 'opened%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 0 |
+---------------+-------+

mysql> show global status like 'opened%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 687 |
+---------------+-------+

  Posted by Sanford Whiteman on December 29, 2009
> [Table is closed when] a table flushing operation occurs. This
> happens when someone issues a FLUSH TABLES statement or executes a
> mysqladmin flush-tables or mysqladmin refresh command.

This section really is telling an incomplete story on Windows in
particular, and could lead to considerable confusion if you've ever
watched your server "come down" from a high open_files/open_tables
period.

If you believe the docs as-is, then if you have, say, open_tables =
700 out of table_cache = 1024, and open_files = 1800 out of
max_open_files = 2048 with absolute peak traffic, you would think it
impossible that those numbers would crawl back down without you
issuing an explicit flush. That isn't the case at all. The flush_time
= 1800 on a default Windows system. That means that every half-hour,
your tables are flushed and you can see the system settle back down to
minimal table and file usage (for example, if you have no late-night
load).

While flush_time can also be used on *nix, there it is 0 by default.

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_flush_time

  Posted by DBA Lead on November 29, 2010
great tutorial on how mysql information_schema databases uses table_cache and what issues might arise if its set too high

http://www.geeksww.com/tutorials/database_management_systems/mysql/installation/mysql_tablecache_informationschema_and_open_files_limit.php
  Posted by Zillur Bhuiyan on July 20, 2015
Optimizing Mysql table_open_cache is important specially for database which has large number of tables.

For setting up optimum value of table_open_cache you have to consider
1) average thread/user for the database;
2) total tables

You can read this article http://www.techinfobest.com/optimize-mysql-table_open_cache/ to know more about this.
Sign Up Login You must be logged in to post a comment.