MyISAM表的緩存 前言: www.2cto.com 今天一個朋友問了一個問題,原文如下: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文件緩存搗的鬼。 www.2cto.com 驗證: 驗證方式其實很簡單,在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文件緩存中。這樣當某些用戶的數據第一次訪問時就不會出現慢查詢了