13.7.6.2 CACHE INDEX 構文

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 でキャッシュにプリロードできます。

次のステートメントは、テーブル 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 の構文では、テーブルの特定のインデックスのみをキャッシュに割り当てるように指定できます。現在の実装では、テーブルのすべてのインデックスをキャッシュに割り当てるため、テーブル名以外のものを指定する理由は何もありません。

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_fastkc_slow という名前の 2 つのキーキャッシュを作成します。

  • パーティション p0 のインデックスを kc_fast キーキャッシュに、パーティション p1p3 のインデックスを 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_nextAUTOMATIC に設定する必要があります。(Bug #16062608、Bug #16715809、Bug #69045)


User Comments
Sign Up Login You must be logged in to post a comment.