CACHE INDEX
tbl_index_list [, tbl_index_list] ...
[PARTITION (partition_list | ALL)]
IN key_cache_name
tbl_index_list:
tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]
partition_list:
partition_name[, partition_name][, ...]
CACHE INDEX
ステートメントは、テーブルインデックスを特定のキーキャッシュに割り当てます。これは、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
ステートメントで参照されるキーキャッシュは、パラメータ設定ステートメントを使用して、またはサーバーのパラメータ設定でそのサイズを設定することによって作成できます。例:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
キーキャッシュのパラメータには、構造化されたシステム変数のメンバーとしてアクセスできます。セクション5.1.5.1「構造化システム変数」を参照してください。
インデックスをキーキャッシュに割り当てるには、そのキーキャッシュが存在している必要があります。
mysql> CACHE INDEX t1 IN non_existent_cache;
ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'
デフォルトで、テーブルインデックスは、サーバー起動時に作成されるメイン (デフォルト) キーキャッシュに割り当てられます。キーキャッシュが破棄されると、それに割り当てられていたインデックスはすべて、デフォルトのキーキャッシュに再度割り当てられます。
インデックスの割り当ては、サーバーにグローバルに影響を与えます。あるクライアントがインデックスを特定のキャッシュに割り当てると、どのクライアントがクエリーを発行したかには関係なく、このキャッシュはそのインデックスに関連するすべてのクエリーに使用されます。
MySQL 5.6 では、このステートメントは、パーティション化された MyISAM
テーブルに対してもサポートされます。1 つ、複数、またはすべてのパーティションの 1 つ以上のインデックスを特定のキーキャッシュに割り当てることができます。たとえば、次のステートメントを実行できます。
CREATE TABLE pt (c1 INT, c2 VARCHAR(50), INDEX i(c1))
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
という名前の 1 つのキーキャッシュに割り当てる場合は、次の 2 つのステートメントのどちらでも使用できます。
CACHE INDEX pt PARTITION (ALL) IN kc_all;
CACHE INDEX pt IN kc_all;
今示した 2 つのステートメントは同等であり、このうちのどちらを発行しても効果はまったく同じです。つまり、パーティション化されたテーブルのすべてのパーティションのインデックスを同じキーキャッシュに割り当てる場合、PARTITION (ALL)
句はオプションです。
複数のパーティションのインデックスをキーキャッシュに割り当てる場合、それらのパーティションが連続している必要はなく、それらの名前を特定の順序でリストする必要もありません。キーキャッシュに明示的に割り当てられていないパーティションのインデックスはすべて、自動的にサーバーのデフォルトのキーキャッシュを使用します。
MySQL 5.6 では、インデックスのプリロードも、パーティション化された MyISAM
テーブルに対してサポートされます。詳細は、セクション13.7.6.5「LOAD INDEX INTO CACHE 構文」を参照してください。
MySQL 5.6.11 でのみ、このステートメントを発行する前に、gtid_next
を AUTOMATIC
に設定する必要があります。(Bug #16062608、Bug #16715809、Bug #69045)