#### 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.html)语句将表索引分配给特定的键缓存。它仅适用于`MyISAM`表，包括分区表`MyISAM`表。分配索引后，如果需要，可以将它们预加载到缓存中[`将索引加载到缓存中`](load-index.html).

以下语句从表中分配索引`t1`,`t2`， 和`t3`到名为的密钥缓存`热缓存`：

```
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.html)使您可以指定仅应将表中的特定索引分配给缓存。但是，该实现将所有表的索引分配给缓存，因此没有理由指定表名以外的任何内容。

中提到的密钥缓存[`缓存索引`](cache-index.html)可以通过使用参数设置语句或在服务器参数设置中设置其大小来创建语句。例如：

```
SET GLOBAL keycache1.key_buffer_size=128*1024;
```

关键缓存参数作为结构化系统变量的成员进行访问。看[第 5.1.9.5 节，“结构化系统变量”](structured-system-variables.html).

在您为其分配索引之前，密钥缓存必须存在，否则会发生错误：

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

默认情况下，表索引分配给在服务器启动时创建的主（默认）键缓存。当一个键缓存被销毁时，分配给它的所有索引都会重新分配给默认的键缓存。

索引分配会全局影响服务器：如果一个客户端将索引分配给给定的缓存，则此缓存将用于所有涉及该索引的查询，无论哪个客户端发出查询。

[`缓存索引`](cache-index.html)支持分区`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`.

-   创建 2 个名为`kc_fast`和`kc_slow`

-   为分区分配索引`p0`到`kc_fast`密钥缓存和分区索引`p1`和`p3`到`kc_slow`密钥缓存；剩余分区的索引 (`p2`) 使用服务器的默认密钥缓存。

    如果您希望为表中的所有分区分配索引`pt`到一个名为`kc_all`，您可以使用以下两种语句之一：


```
CACHE INDEX pt PARTITION (ALL) IN kc_all;

CACHE INDEX pt IN kc_all;
```

刚才显示的两个语句是等价的，发出任何一个都具有完全相同的效果。换句话说，如果您希望将分区表的所有分区的索引分配给同一个键缓存，则`分区（全部）`子句是可选的。

将多个分区的索引分配给一个键缓存时，这些分区不需要是连续的，并且您不需要以任何特定的顺序列出它们的名称。未明确分配给键缓存的任何分区的索引会自动使用服务器默认键缓存。

分区也支持索引预加载`MyISAM`表。有关详细信息，请参阅[第 13.7.8.5 节，“LOAD INDEX INTO CACHE 语句”](load-index.html).
