MyISAM表的缓存
来源:互联网 发布:查看存储过程的sql 编辑:程序博客网 时间:2024/05/16 15:25
前言:
今天一个朋友问了一个问题,原文如下: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文件缓存中。这样当某些用户的数据第一次访问时就不会出现慢查询了
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- MyISAM表的缓存
- MyISAM表的缓存
- Innodb和Myisam的缓存机制
- MyISAM索引缓存的相关参数及性能计算公式
- 修复损坏的MyISAM表
- MyISAM 表的锁定机制
- mysql myisam表的repair
- 如何修复损坏的MyISAM表
- 如何修复损坏的MyISAM表
- 自动修复MySQL的myisam表
- myisam引擎的表锁优化
- 针对MyISAM锁表的解决方案
- 【mysql】MyISAM表的存储格式
- MySQL的MyISAM表使用注意事项
- myisam表迁移数据的最快方法
- MySQL 针对 MyISAM 表锁的解决方案
- MySQL的myisam引擎表锁优化
- MyISAM表的存储格式---行格式
- 长连接和短连接,单工、半双工和全双工
- 红薯 MySQL 5.5 和 5.6 默认参数值的差异
- stdafx.h
- MySql Workbench中的BUG
- c#我不知道的类型
- MyISAM表的缓存
- lucene自定义过滤器
- typename的用法
- python操作mysql方法和常见问题
- MySQL5.6安装步骤(windows7 64位)
- [Python] python入门指引
- Android手机的Bootloader以及一些概念解释
- XCode添加任何控件运行都报异常的原因
- java文件操作学习笔记