Query通过索引检索表数据过程
1.query请求,直接读取key cache中的cache block,有则返回;
2.没有则到.MYI文件中以file block方式读取数据;
3.然后以完全相同的格式存入key cache做为cache block;
4.然后再将key cache中的数据返回;
mysql> show status like 'Key%'; +------------------------+-------------+ | Variable_name | Value | +------------------------+-------------+ | Key_blocks_not_flushed | 0 | | Key_blocks_unused | 5779253 | | Key_blocks_used | 3184154 | | Key_read_requests | 19813453982 | | Key_reads | 136159256 | | Key_write_requests | 2249688875 | | Key_writes | 1567010771 | +------------------------+-------------+ Key_blocks_not_flushed 已经更改但未刷新到磁盘的dirty cache block; Key_blocks_unused 目前未被使用的cache block数目; Key_blocks_used 已经使用了的cache block数目; Key_read_requests cache block被请求读取的总次数; Key_reads 在cache block中找不到需要读取的key,到“myi”文件读取的次数; Key_write_requests 被请求修改的总次数; Key_writes 在cache block中找不到需要修改的key信息后,到“myi”文件写入再修改的次数; Key_buffer使用率 = Key_blocks_used/ (Key_blocks_used+ Key_blocks_unused)*100% Key_buffer读命中率 = 1- Key_reads/ Key_read_requests *100% Key_buffer使用率应该在99%以上,如果过低说明key_buffer_size设置过高,mysql根本用不完; Key_buffer读命中率应该尽可能高,如果过低说明key_buffer_size设置过低,mysql无法在cache block中添加更多数据;
如果系统主要以写为主,尤其有大量insert语句时,为了提高insert效率,可以讲concurrent_insert设置为2,也就是告诉MyISAM,不管在表中是否有删除行留下的空余空间,都在尾部进行并发插入,使insert和select互补干扰;
一般来说,在每次做了较大的数据删除操作之后都需要做一次optimize优化整理,每个季度有一次optimize操作;
原文地址:http://www.linuxsee.com/mysql/mysql%E4%B8%ADmyisam%E5%BC%95%E6%93%8E%E4%BC%98%E5%8C%96.html