MyISAM表的索引只需打开一次,多个线程间共享
数据文件则是每个线程各自打开
key_buffer_size 只缓存MyISAM的索引数据,不缓存行数据
行数据是由操作系统的OS page cache来进行缓存的
如果只要使用MyISAM引擎,推荐设置可用RAM的20%~50%
更多的内存留给OS执行OS page cache,缓存从*.MYD读取的行数据
因为热点数据不会太多20%~50%就够了
如果key_buffer_size设置太大,会造成内存空间浪费,设置太小又会造成缓存命中率太低
可以先看当前*.MYI(索引文件)总大小,设置对应的key buffer size
如果总的索引文件只有1个G 那我们就设置成1个G
如果索引文件太大了 那就遵循28原则(20%的热点数据产生80%的访问量),或者37开
然后再观察命中率,如果太低了就把参数调第一点,如果太高了 就调高一点
计算公式(更多时候是看读的命中率):
key_buffer_read_hits=(1-Key_reads/Key_read_requests)*100%
key_buffer_write_hits=(1-Key_writes/Key_write_requests)*100%
Key_reads:发生物理读的次数(不是通过key_buffer读索引的次数)
Key_read_requests:总的请求次数
即便全是innodb表,没有用MyISAM,也是要设置该值用于缓存临时表的索引,推荐32M
设置key_buffer_size的方法:
1.my.cnf中:key_buffer_size=4G(32-bit系统下最大4G, 64-bit下可以超过4G)
hot_cache.key_buffer_size=2G
cold_cache.key_buffer_size=2G
可以设置多个key buffer
set global k1.key_buffer_size=1G
set global k2.key_buffer_size=1G
将索引load到执指定的key buffer
CACHE INDEX db1.t1, db1.t2, db2.t3 IN hot_cache;
CACHE INDEX db1.t4, db2.t5, db2.t6 IN cold_cache;
2.mysql命令行中:set global key_baffer_size = 4*1024*1024*2014