13.7.6.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语句将 table 索引分配给特定的键高速缓存。它仅适用于MyISAMtable,包括分区的MyISAMtable。分配索引后,可以根据需要使用将索引加载到缓存中将它们预加载到缓存中。

以下语句将 tablet1t2t3的索引分配给名为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的语法使您可以指定仅将 table 中的特定索引分配给缓存。但是,该实现将 table 的所有索引分配给高速缓存,因此,除了 table 名外,没有其他必要指定任何内容。

可以通过使用参数设置语句或在服务器参数设置中设置其大小来创建CACHE INDEX语句中引用的键高速缓存。例如:

SET GLOBAL keycache1.key_buffer_size=128*1024;

关键高速缓存参数作为结构化系统变量的成员进行访问。参见第 5.1.8.3 节“结构化的系统变量”

在为索引分配索引之前,必须存在键缓存,否则会发生错误:

mysql> CACHE INDEX t1 IN non_existent_cache;
ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'

默认情况下,table 索引分配给服务器启动时创建的主(默认)键高速缓存。销毁键高速缓存时,分配给它的所有索引都将重新分配给默认键高速缓存。

索引分配会全局影响服务器:如果一个 Client 端将索引分配给给定的缓存,则该缓存将用于所有与索引相关的查询,而不管哪个 Client 端发出查询。

分区MyISAMtable 支持CACHE INDEX。您可以将一个,多个或所有分区的一个或多个索引分配给给定的键高速缓存。例如,您可以执行以下操作:

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 个分区的分区 table;这些分区会自动命名为p0,...,p3;该 table 在c1列上有一个名为i的索引。

  • 创建两个名为kc_fastkc_slow的密钥缓存

  • 将分区p0的索引分配给kc_fast键高速缓存,并将分区p1p3的索引分配给kc_slow键高速缓存;剩余分区的索引(p2)使用服务器的默认键高速缓存。

如果您希望将 tablept中所有分区的索引分配给名为kc_all的单个键高速缓存,则可以使用以下两个语句之一:

CACHE INDEX pt PARTITION (ALL) IN kc_all;

CACHE INDEX pt IN kc_all;

刚刚显示的两个语句是等效的,发出其中一个具有完全相同的效果。换句话说,如果您希望将分区 table 的所有分区的索引分配给同一键高速缓存,则PARTITION (ALL)子句是可选的。

在将多个分区的索引分配给键高速缓存时,这些分区不必是连续的,并且您无需按任何特定 Sequences 列出其名称。未明确分配给键高速缓存的任何分区的索引将自动使用服务器默认键高速缓存。

分区MyISAMtable 也支持索引预加载。有关更多信息,请参见第 13.7.6.5 节“ LOAD INDEX INTO CACHE 语句”