Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.7.8.2 缓存索引语句

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 将索引预加载到缓存中。

以下语句将表 t1t2t3 的索引分配到名为 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;

键缓存成员是结构化系统变量的成员。见第7.1.9.5节,“结构化系统变量”

在分配索引前,键缓存必须存在,否则会出现错误:

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

默认情况下,表索引被分配到服务器启动时创建的主(默认)键缓存中。销毁一个键缓存时,所有分配给它的索引都会重新分配到默认键缓存中。

索引分配对服务器全局有效:如果一个客户端将一个索引分配给某个缓存,这个缓存用于所有涉及该索引的查询,无论哪个客户端发出查询。

CACHE INDEX 对分区 MyISAM 表支持。您可以将一个或多个索引分配给某个键缓存。例如,您可以执行以下操作:

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

  • 创建 2 个键缓存名为 kc_fastkc_slow

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

如果您想将表 pt 的所有分区索引分配给一个名为 kc_all 的键缓存,可以使用以下两个语句之一:

CACHE INDEX pt PARTITION (ALL) IN kc_all;

CACHE INDEX pt IN kc_all;

上述两个语句等效,执行任意一个都有相同的效果。换言之,如果你想将所有分区表的索引分配到同一个键缓存中,那么PARTITION (ALL)子句是可选的。

当为多个分区分配键缓存时,分区不需要连续,也不需要按特定的顺序列出它们的名称。对任何未明确分配到键缓存的分区自动使用服务器默认键缓存。

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