Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


8.9.2.2 複合キーキャッシュ

キーキャッシュへの共有アクセスはパフォーマンスを向上させますが、セッション間の競合を完全には排除しません。それらはまだキーキャッシュバッファーへのアクセスを管理する制御構造を得るために争います。キーキャッシュアクセスの競合をもっと軽減するために、MySQL は複合キーキャッシュも提供しています。この機能により、異なるキーキャッシュにさまざまなテーブルインデックスを割り当てることができます。

複合キーキャッシュがある場合、サーバーは特定の MyISAM テーブルに対してクエリーを処理する際に、使用すべきキャッシュを知っている必要があります。デフォルトでは、すべての MyISAM テーブルインデックスはデフォルトのキーキャッシュにキャッシュされます。テーブルインデックスを特定のキーキャッシュに割り当てるには、CACHE INDEX ステートメントを使用します (セクション13.7.6.2「CACHE INDEX 構文」を参照してください)。たとえば、次のステートメントは t1t2、および t3 テーブルから、hot_cache という名前のキーキャッシュにインデックスを割り当てます。

mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table   | Op                 | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status   | OK       |
| test.t2 | assign_to_keycache | status   | OK       |
| test.t3 | assign_to_keycache | status   | OK       |
+---------+--------------------+----------+----------+

CACHE INDEX ステートメントで参照されているキーキャッシュは、SET GLOBAL パラメータ設定ステートメントでそのサイズを設定するか、またはサーバー起動オプションを使用して作成できます。例:

mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;

キーキャッシュを破棄するには、そのサイズをゼロに設定します。

mysql> SET GLOBAL keycache1.key_buffer_size=0;

デフォルトのキーキャッシュは破棄できません。これを実行するすべての試みは無視されます。

mysql> SET GLOBAL key_buffer_size = 0;

mysql> SHOW VARIABLES LIKE 'key_buffer_size';
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8384512 |
+-----------------+---------+

キーキャッシュ変数は名前とコンポーネントのある構造化システム変数です。keycache1.key_buffer_size の場合、keycache1 はキャッシュ変数名であり、key_buffer_size はキャッシュコンポーネントです。構造化キーキャッシュシステム変数を参照するために使用する構文の詳細については、セクション5.1.5.1「構造化システム変数」を参照してください。

デフォルトで、テーブルインデックスは、サーバー起動時に作成されるメイン (デフォルト) キーキャッシュに割り当てられます。キーキャッシュが破棄されると、それに割り当てられたすべてのインデックスはデフォルトのキーキャッシュに再割り当てされます。

ビジーなサーバーの場合、3 つのキーキャッシュを含む戦略を使用できます。

  • すべてのキーキャッシュに割り当てられたスペースの 20% を占めるホットキーキャッシュ。これは、検索に頻繁に使用されるが、更新されないテーブルに使用します。

  • すべてのキーキャッシュに割り当てられたスペースの 20% を占めるコールドキーキャッシュ。このキャッシュは、一時テーブルなどの中規模の集中的に変更されるテーブルに使用します。

  • キーキャッシュスペースの 60% を占めるウォームキーキャッシュ。これは、デフォルトでほかのすべてのテーブルに使用されるように、デフォルトのキーキャッシュとして使用します。

3 つのキーキャッシュを使用することに利点がある理由の 1 つは、1 つのキーキャッシュ構造へのアクセスが、ほかへのアクセスをブロックしないことです。あるキャッシュに割り当てられたテーブルにアクセスするステートメントは、ほかのキャッシュに割り当てられたテーブルにアクセスするステートメントと競合しません。パフォーマンスの向上はほかの理由でも発生します。

  • ホットキャッシュはクエリーの取得にのみ使用されるため、その内容が変更されることはありません。その結果、インデックスブロックをディスクから取り出す必要がある場合常に、置き換えのために選択されたキャッシュブロックの内容を最初にフラッシュする必要はありません。

  • ホットキャッシュに割り当てられたインデックスの場合、インデックススキャンを必要とするクエリーがなければ、インデックス B ツリーの非リーフノードに対応するインデックスブロックがキャッシュに残っている可能性が高くなります。

  • 一時テーブルに対するもっとも頻繁に実行される更新操作は、更新されるノードがキャッシュ内にあり、最初にディスクから読み取られる必要がない場合、はるかに高速に実行されます。一時テーブルのインデックスのサイズがコールドキーキャッシュのサイズと同程度である場合、更新されるノードがキャッシュ内にある可能性が高くなります。

CACHE INDEX ステートメントは、テーブルとキーキャッシュ間のアソシエーションをセットアップしますが、そのアソシエーションはサーバーが再起動されるたびに失われます。サーバーが起動するたびにアソシエーションを有効にしたい場合、これを実現する 1 つの方法はオプションファイルを使用することです。キーキャッシュを構成する変数設定と、実行される CACHE INDEX ステートメントを含むファイルを指定する init-file オプションを含めます。例:

key_buffer_size = 4G
hot_cache.key_buffer_size = 2G
cold_cache.key_buffer_size = 2G
init_file=/path/to/data-directory/mysqld_init.sql

サーバーが起動するたびに mysqld_init.sql 内のステートメントが実行されます。ファイルには 1 行に 1 つずつ SQL ステートメントを含めてください。次の例は hot_cachecold_cache に複数のテーブルをそれぞれ割り当てます。

CACHE INDEX db1.t1, db1.t2, db2.t3 IN hot_cache
CACHE INDEX db1.t4, db2.t5, db2.t6 IN cold_cache

User Comments
  Posted by Haluk Akin on November 30, 2010
At this time it looks like getting information on custom active key caches is not very easy.

I filed a feature request here:
http://bugs.mysql.com/bug.php?id=58524

In return Shane Bester commented that I can run a "mysqladmin debug" and it will output some information about the custom key caches into the mysql log.

It is a start, it helped me and it might help some others.
However, still, there is a need to be able to query more information on custom key caches. Most importantly we need to be able to query which tables are assigned to which custom key cache.
Sign Up Login You must be logged in to post a comment.