MyISAM表的缓存

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文件缓存中。这样当某些用户的数据第一次访问时就不会出现慢查询了

时间: 2024-10-10 01:43:08

MyISAM表的缓存的相关文章

使用MyISAM表和InnoDB的一些记录

key_buffer_size - 这对MyISAM表来说非常重要.如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%.合理的值取决于索引大小.数据量以及负载.记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了.尽管如此,需要总是检查是否所有的 key_buffer 都被利用了..MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的.这么做太浪费了.如果你很少使用MyISAM表,那么也保留低

MySQL中损坏的MyISAM表

即使MyISAM表格式非常可靠(SQL语句对表做的所有改变在语句返回之前被写下),如果下列任何事件发生,你依然可以获得损坏的表: · MySQLd进程在写中间被杀掉. · 发生未预期的计算机关闭(例如,计算机被关闭). · 硬件故障. · 你可以同时在正被服务器修改的表上使用外部程序(如myisamchk). · MySQL或MyISAM代码的软件缺陷. 一个损坏的表的典型症状如下: · 当在从表中选择数据之时,你得到如下错误: · Incorrect key file for table: '

修复MySQL的MyISAM表命令check table用法

MySQL日志文件里出现以下错误,MySQL表通常不会发生crash情况,一般是在更新数据库时MySQL停止会导致. CHECK TABLE语法 CHECK TABLE tbl_name[,tbl_name] ... [option] ... option= {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} 检查一个或多个表是否有错误.CHECK TABLE对MyISAM和InnoDB表有作用.对于MyISAM表,关键字统计数据被更新. CHECK TAB

数据库内核月报 - 2015 / 08-MySQL · 功能分析 · MySQL表定义缓存

表定义 MySQL的表包含表名,表空间.索引.列.约束等信息,这些表的元数据我们暂且称为表定义信息. 对于InnoDB来说,MySQL在server层和engine层都有表定义信息.server层的表定义记录在frm文件中,而InnoDB层的表定义信息存储在InnoDB系统表中.例如: InnoDB_SYS_DATAFILES InnoDB_SYS_TABLESTATS InnoDB_SYS_INDEXES InnoDB_SYS_FIELDS InnoDB_SYS_TABLESPACES Inn

redis 配置-对于web应用,除了基本的配置,其他的配置使用properties文件还是配置表加缓存比较好呢?

问题描述 对于web应用,除了基本的配置,其他的配置使用properties文件还是配置表加缓存比较好呢? 比如我会调用另外一个服务,有一个url,这个url写在properties里面好呢,还是数据库有一张配置表 ,把url放在配置表里面,然后会放到缓存,读不到才读数据库,这样可以在url变更后直接改数据库清redis就生效,但是properties读到内存里面,相对会快点.到底哪个好. 解决方案 写在properties文件中的内容是程序发布后不再会修改的内容,服务启动时加载在内存中,便于程

MYSQL MyISAM表锁

锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素. 从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单

MySQL实现MYISAM表批量压缩的方法_Mysql

本文实例讲述了MySQL实现MYISAM表批量压缩的方法.分享给大家供大家参考,具体如下: 关于对MYISAM表的压缩,可以使用myisampack和myisamchk完成(myisampack完之后必须进行myisamchk才能使用压缩后的表,而且是只读的), 其详细地用法可以参考官方文档: http://dev.mysql.com/doc/refman/5.1/zh/client-side-scripts.html. 这两个操作需要谨慎使用,在压缩之前需要确认mysqld已关闭或者要压缩的表

总结mysql数据库中InnoDB与Myisam表类型的的六大区别

一.构成上的区别: MyISAM 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex). InnoDB 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB 二.事务处理上方面: MyISAM MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不

遍历echsop的region表形成缓存的程序实例代码_php实例

如下所示: header("Content-type: text/html; charset=utf-8"); $con = mysql_connect("localhost","root","root"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("ecshop", $con); $result