MySQL documentation意味着您可以将一个或多个表的索引分配给命名的密钥缓冲区(并预加载它们)。手册中的语法定义是:
CACHE INDEX
tbl_index_list [, tbl_index_list] ...
IN key_cache_name
tbl_index_list:
tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]
似乎说你只能将一个表的索引分配给指定的密钥缓冲区。例如:
SET GLOBAL my_keys.key_buffer_size=512*1048576;
CACHE INDEX my_table KEY (PRIMARY) INTO my_keys;
LOAD INDEX INTO CACHE my_table KEY (PRIMARY);
只会加载my_table的PRIMARY索引。
但是从我所知道的情况来看,它至少不是这样,至少不是5.0.87。相反,服务器似乎加载了所有表的索引,实际上忽略了括号中的索引列表部分。
例如,我有一个很大的字典表:
CREATE TABLE dict (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(330) NOT NULL,
UNIQUE KEY (name) );
现在,如果我尝试只加载PRIMARY索引,mysqld在内存中的驻留大小会增加dict.MYI(在我的示例中为733 MB)的大小,这比单独使用PRIMARY索引的大小要大(103) MB)。
更新2011-01-08 :documentation for CACHE INDEX
实际上提供了答案:
CACHE INDEX的语法使您能够指定只应将表中的特定索引分配给缓存。当前实现将所有表的索引分配给缓存,因此没有理由指定除表名之外的任何内容。
如果我能正确阅读我在OP中引用的文档,那么这一切都不会发生。
答案 0 :(得分:3)
fsb回答了他自己的问题。
CACHE INDEX的语法使您具备 指定只有特定的 表中的索引应该是 分配给缓存。目前 实现分配所有表 索引到缓存,所以没有 理由除了指定以外的任何东西 表名。
答案 1 :(得分:0)
CACHE INDEX
此限制不适用于MySQL 5.7.2或更高版本