发一下牢骚和主题无关:
媒介:
天今一个友人问了一个题问,原文如下: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文件缓存中。这样当某些户用的据数第一次拜访时就不会现出慢查询了
文章结束给大家分享下程序员的一些笑话语录: 看新闻说中国输入法全球第一!领先了又如何?西方文字根本不需要输入法。一点可比性都没有。