文档首页
MySQL 9.0 参考手册
相关文档 下载本手册

MySQL 9.0 参考手册  /  ...  /  CACHE INDEX 语句

15.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 将它们预加载到缓存中。

以下语句将表 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 的索引。

  • 创建两个名为 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 语句”