CACHE INDEX {
tbl_index_list [, tbl_index_list] ...
| tbl_name PARTITION (partition_list)
}
IN key_cache_name
tbl_index_list:
tbl_name [{INDEX|KEY} (index_name[, index_name] ...)]
partition_list: {
partition_name[, partition_name] ...
| ALL
}
CACHE INDEX
ステートメントは、テーブルインデックスを特定のキーキャッシュに割り当てます。 パーティション化された MyISAM
テーブルを含む MyISAM
テーブルにのみ適用されます。 インデックスが割り当てられたら、これらのインデックスを、必要に応じて LOAD INDEX INTO CACHE
でキャッシュにプリロードできます。
次のステートメントは、テーブル t1
、t2
、および 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
の構文では、テーブルの特定のインデックスのみをキャッシュに割り当てるように指定できます。 ただし、実装ではすべてのテーブルインデックスがキャッシュに割り当てられるため、テーブル名以外を指定する理由はありません。
CACHE INDEX
ステートメントで参照されるキーキャッシュは、パラメータ設定ステートメントを使用して、またはサーバーのパラメータ設定でそのサイズを設定することによって作成できます。 例:
SET GLOBAL keycache1.key_buffer_size=128*1024;
キーキャッシュパラメータには、構造化システム変数のメンバーとしてアクセスします。 セクション5.1.9.5「構造化システム変数」を参照してください。
インデックスを割り当てる前に、キーキャッシュが存在している必要があります。存在していない場合は、エラーが発生します:
mysql> CACHE INDEX t1 IN non_existent_cache;
ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'
デフォルトで、テーブルインデックスは、サーバー起動時に作成されるメイン (デフォルト) キーキャッシュに割り当てられます。 キーキャッシュが破棄されると、それに割り当てられたすべてのインデックスはデフォルトのキーキャッシュに再割り当てされます。
インデックスの割り当ては、サーバーにグローバルに影響を与えます。あるクライアントがインデックスを特定のキャッシュに割り当てると、どのクライアントがクエリーを発行したかには関係なく、このキャッシュはそのインデックスに関連するすべてのクエリーに使用されます。
CACHE INDEX
は、パーティション化された MyISAM
テーブルでサポートされています。 1 つ、複数、またはすべてのパーティションの 1 つ以上のインデックスを特定のキーキャッシュに割り当てることができます。 たとえば、次のステートメントを実行できます。
CREATE TABLE pt (c1 INT, c2 VARCHAR(50), INDEX i(c1))
ENGINE=MyISAM
PARTITION BY HASH(c1)
PARTITIONS 4;
SET GLOBAL kc_fast.key_buffer_size = 128 * 1024;
SET GLOBAL kc_slow.key_buffer_size = 128 * 1024;
CACHE INDEX pt PARTITION (p0) IN kc_fast;
CACHE INDEX pt PARTITION (p1, p3) IN kc_slow;
前の一連のステートメントは、次のアクションを実行します。
4 つのパーティションを含むパーティション化されたテーブルを作成します。これらのパーティションには、自動的に
p0
、...、p3
という名前が付けられます。このテーブルには、カラムc1
上にi
という名前のインデックスが含まれています。kc_fast
とkc_slow
という名前の 2 つのキーキャッシュを作成します。パーティション
p0
のインデックスをkc_fast
キーキャッシュに、パーティションp1
とp3
のインデックスをkc_slow
キーキャッシュに割り当てます。残りのパーティション (p2
) のインデックスは、サーバーのデフォルトのキーキャッシュを使用します。
かわりに、テーブル pt
のすべてのパーティションのインデックスを kc_all
という名前の単一のキーキャッシュに割り当てる場合は、次のいずれかのステートメントを使用できます:
CACHE INDEX pt PARTITION (ALL) IN kc_all;
CACHE INDEX pt IN kc_all;
ここで示した 2 つのステートメントは同等であり、どちらか一方を発行してもまったく同じ効果があります。 つまり、パーティションテーブルのすべてのパーティションのインデックスを同じキーキャッシュに割り当てる場合、PARTITION (ALL)
句はオプションです。
複数のパーティションのインデックスをキーキャッシュに割り当てる場合、パーティションは連続している必要はなく、それらの名前を特定の順序でリストする必要はありません。 キーキャッシュに明示的に割り当てられていないパーティションのインデックスは、サーバーのデフォルトのキーキャッシュを自動的に使用します。
インデックスのプリロードは、パーティション化された MyISAM
テーブルでもサポートされています。 詳細は、セクション13.7.8.5「LOAD INDEX INTO CACHE ステートメント」を参照してください。