LOAD CACHE INTO CACHE
MySQL可以把索引文件预先加载到指定的缓存中:
LOAD INDEX INTO CACHE table_name;
LOAD INDEX INTO CACHE table_name INDEX (index_name_1, index_name_2);
LOAD INDEX INTO CACHE table_name INDEX (index_name_1, index_name_2) IGNORE LEAVES;
对于查询型的超大型的表,当没有足够的内存时,可以使用 IGNORE LEAVES 的方式加载索引到缓存。比如一个接近1Billion的数据表,其索引可能也是几G大小的。下面这个例子就显示了当预先加载数据索引时,查询的速度变化,这个数据表有接近1亿条记录,3个索引,有超过3G的大小,对于同一个查询:
#mysql> select * from tbigdatatable where username in (‘ABCDEF’, ‘19740821’)
在非预先加载索引以及预载索引的情况下,查询的响应区别:
#mysqld_safe –key-buffer-cache=1073741824
####不预载索引#### 5 rows in set (0.65 sec)
######预载索引#### 5 rows in set (1.94 sec)
当然一个查询有很大的偶然性,不过从一个大量的查询平均来看,这个效果还是有很大的差别的。
如果一个表的索引包含不同的key_block_size,那么这个预装载将会遇到困难, 如:
alter table tbigdatatable add index idx_bigdatatable_username(username) key_block_size=8192, add index idx_bigdatatable_email(email) key_block_size=8192, add index idx_bigdatatable_id(id) key_block_size=1024;
load index into cache tbigdatatable index (idx_bigdatatable_username, idx_bigdatatable_email) ignore leaves;
+————————+————–+———-+————————————-+
| Table | Op | Msg_type | Msg_text |
+————————+————–+———-+————————————-+
| coredata.tbigdatatable | preload_keys | error | Indexes use different block sizes |
| coredata.tbigdatatable | preload_keys | error | Subpartition p178sp0 returned error |
| coredata.tbigdatatable | preload_keys | status | Operation failed |
+————————+————–+———-+————————————-+
因为.MYI中包含不同block_size的索引,所以无法预加载!
MySQL 5.1 对分区表不能预装载索引:
preload_keys | note | The storage engine for the table doesn’t support preload_keys
真是不幸, 这些版本包括: 5.1.47, 5.1.61-community-log
因为手头上没有MySQL5.5的数据库可供使用,所以关于预装载索引到内存的方法只能暂时放一放,这也导致了我的另外一个测试项目差点夭折:9千万数据的分区表查询,每个查询要耗时1m左右,伤不起啊。