bitscn.com
myisam表的缓存
前言:
今天一个朋友问了一个问题,原文如下:mysql5.1,myisam的表,select count(*) as total from m_bff where from_uid='73149293' and isdeleted=0。from_uid上有索引,第一次执行这个句子速度慢,1秒多,用show profile看都慢在sending data上。但是紧接着我加上sql_no_cache,执行只需要0.01秒了,有好多句子都是类似的情况第一次慢,后来加上sql_no_cache也不慢,key_blocks_unused也很多,请教下这种是什么原因呢?
问题总结一下就是:对于myisam表的查询,为何第一次会比第二次慢非常多?
回想innodb和myisam的区别,其中非常重要的一个就是myisam只缓存索引内容,而innodb不仅缓存索引还缓存数据。那照理说myisam每次的数据查询都应该是disk access不会有很大的速度差距吧。
其实在myisam的文件和操作系统之间还有一层os级别的文件缓存。猜测就是os文件缓存捣的鬼。
验证:
验证方式其实很简单,在shell下以root权限运行 cat 3 > /proc/sys/vm/drop_caches 把os的文件缓存清空,再运行sql看看是不是和第一次运行的速度一样就可以知道了。
结果:
恩,echo 3 /proc/sys/vm/drop_caches 之后就又慢了,看来就是你说的问题了
引申:
知道了myisam这个特性后,可以用文件预读的方法来做数据预热。
假设某个表是热点表,且操作系统又有较多的内存空余。我们可以用cat table.myd >> /dev/null 的方式来把文件加载到os文件缓存中。这样当某些用户的数据第一次访问时就不会出现慢查询了
bitscn.com
