MySQL 8.0 リファレンスマニュアル


13.7.8.2 CACHE INDEX ステートメント

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

次のステートメントは、テーブル 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 ステートメントで参照されるキーキャッシュは、パラメータ設定ステートメントを使用して、またはサーバーのパラメータ設定でそのサイズを設定することによって作成できます。 例:

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

  • パーティション p0 のインデックスを kc_fast キーキャッシュに、パーティション p1p3 のインデックスを 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 ステートメント」を参照してください。


関連キーワード:  ステートメント, CREATE, TABLE, インデックス, キャッシュ, テーブル, DROP, CACHE, キー, サブクエリー