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
。
以下语句将表
t1
、t2
和
中的索引分配给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.8.3 节,“结构化系统变量”。
在为它分配索引之前,键缓存必须存在,否则会发生错误:
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
; 该表有一个名为i
column的索引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;
刚才显示的两个语句是等价的,发出任何一个都具有完全相同的效果。换句话说,如果您希望将分区表的所有分区的索引分配给同一个键缓存,则该PARTITION (ALL)
子句是可选的。
将多个分区的索引分配给键缓存时,分区不需要是连续的,并且您不需要以任何特定顺序列出它们的名称。未明确分配给键缓存的任何分区的索引自动使用服务器默认键缓存。
MyISAM
分区表
也支持索引预加载
。有关详细信息,请参阅
第 13.7.6.5 节,“将索引加载到缓存语句”。
仅在 MySQL 5.6.11 中,gtid_next
必须AUTOMATIC
在发出此语句之前设置为。(错误#16062608、错误#16715809、错误#69045)