myisam 存储引擎使用key buffer 缓存索引块,以加速myisam索引的读写速度.对于myisam表的数据块,没有特别的缓存机制,完全依赖于操作系统的io缓存
key_buffer_size 设置.
- key_buffer_size 决定 myisam 索引区的大小.直接影响myisam表的存取速率.可以在参数文件中设置key_buffer_size的值,建议至少1/4的内存分配给key_buffer_size.
- 我们可以通过key_read_requests,key_reads,key_write_requests和key_writes 等mysql 状态变量来评估索引缓存的效率.
- 一般来说,索引块物理读比率key_reads/key_read_requests 应小于0.01,索引块写比率 key_write/key_write_requests 也应应可能小.对于更新和删除操作特别多的应用.key_write/key_write_requests 可能接近1,对于每次更新很多行的记录应用.key_write/key_write_requests就会比较小.
- key_buffer 使用率=1-((key_blocks_unused*key_cache_block_size)/key_buffer_size) 一般来说,使用率在80%比较合适,大于可能因索引缓存不足而导致性能下降. 小于80%,存在内存浪费.
使用多个索引缓存
- 减少session 间对key buffer 的竞争.
调整’中点插入的策略’
- 调节key_cache_division_limit 来控制多大比例的缓存用做warm list. 默认值100.意思全部缓存块都放在warm子表.其实就是不启用’中点插入策略’.如果我们希望大致30%的缓存用来cache 最热的索引块,可以设置.
set global key_cache_division_limit = 70
set global hot_cache.key_cache_division_limit = 70; - 调节 key_cache_age_threshold 控制数据块由hot 子表 向warm 表降级的时间.值越小,数据块将越快被降级.
调整read_buffer_size 和read_rnd_buffer_size.
- 如果需要顺序扫描myisam 表,可以通过增大read_buffer_size的值来改善性能. 注意read_buffer_size 是每个session独占的,如果默认值太大,会造成内存浪费.
- 如果做排序的查询 如order by 子句的sql,适当增大read_rnd_buffer_size的值. 默认值不要太大