MySQL中的“CACHE INDEX”和“LOAD INDEX INTO CACHE”

时间:2010-12-24 20:59:30

标签: mysql caching indexing

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中引用的文档,那么这一切都不会发生。

2 个答案:

答案 0 :(得分:3)

对于那些错过更新的人来说,

fsb回答了他自己的问题。

  

CACHE INDEX的语法使您具备   指定只有特定的   表中的索引应该是   分配给缓存。目前   实现分配所有表   索引到缓存,所以没有   理由除了指定以外的任何东西   表名。

答案 1 :(得分:0)

CACHE INDEX

  

此限制不适用于MySQL 5.7.2或更高版本