Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

8.10.2.2 複合キーキャッシュ

注記

MySQL 8.0 では、複数の MyISAM キーキャッシュを参照するためにここで説明する複合部分構造変数構文は非推奨になりました。

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

複合キーキャッシュがある場合、サーバーは特定の MyISAM テーブルに対してクエリーを処理する際に、使用すべきキャッシュを知っている必要があります。 デフォルトでは、すべての MyISAM テーブルインデックスはデフォルトのキーキャッシュにキャッシュされます。 テーブルインデックスを特定のキーキャッシュに割り当てるには、CACHE INDEX ステートメントを使用します (セクション13.7.8.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.9.5「構造化システム変数」を参照してください。

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

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

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

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

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

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

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

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

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

CACHE INDEX ステートメントは、テーブルとキーキャッシュ間のアソシエーションをセットアップしますが、そのアソシエーションはサーバーが再起動されるたびに失われます。 サーバーが起動するたびにアソシエーションを有効にするには、オプションファイルを使用: キーキャッシュを構成する変数設定と、実行する 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