MySQL[PGA] MyISAM key_buffer_size

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