MyISAM引擎中,为了提高io效率以及读取效率,将对磁盘频繁读取的索引数据加载至内存中操作。

MyISAM设计了一个在存放在内存中的索引缓冲池Key Cache。Key Cache只缓存索引数据,通过LRU算法将读取频繁的索引加载到Key Cache中来。

通过系统变量 key_buffer_size 来控制Key Cache的大小,这个变量关乎到缓存的性能。

InnoDB引擎中,同样设置了缓存池buffer pool,与MyISAM有所区别的是,buffer pool不仅仅缓存了索引数据,同时还缓存了表数据。

这样的缓冲池同时也带来了很多问题:缓存中的数据如何与磁盘上的数据保持一致,缓存中的数据支不支持修改更新操作,以及与日志记录模块的同步等等问题。

要解决这些问题带来的操作时繁琐的,但是相比于整体性能的提升,也是值得的:硬盘的存取速度与内存的速度更本不是一个数量级的,通过内存来读取数据,可以大大的提高数据库的整体性能。

MySQL官方文档这样建议,除了用于系统运行的内存外,剩余的内存建议尽可能大的设置buffer pool。这样一来有着大容量的buffer pool,在实际应用上的表现更像与一个in-memory database,相比于对磁盘的读写速度,读写性能简直就是巨大的提升。

这一切当然基于读取数据在buffer pool的命中率上面,修改更新等操作会改变buffer pool的一些数据,通过LRU算法更新,将buffer pool的命中率维持在一个比较高的水平。

还有一个问题就是怎么将buffer pool中的数据同步到磁盘。想想如果更新一次buffer pool就写一次磁盘,那这样子的效率和直接读写磁盘并没有提高多少,这里就需要设计出同步策略来解决这个问题。

InnoDB是事务安全的,修改buffer pool的数据后,同时还要将此操作记录在事务日志中去。这里对buffer pool的修改操作后,并没有直接将数据同步到磁盘,而是将此操作记录到事务日志文件中去。这里又有一个疑问,为什么不将数据写到磁盘的表数据文件里去,而是写到磁盘的事务日志文件去呢,同样是磁盘写操作,有何不同?

这里涉及到磁盘寻道读写问题,学过计算机组成原理的就知道了,磁盘读写可以分为两种:顺序读写以及随机读写,如果为随机读写,将要花一定的时间用于磁头寻址上,如果为顺序读写,则是连续的将数据写入磁面,磁头寻址操作很少。这两种读写方式的效率也可见区别甚大

事务日志文件是InnoDB引擎申请连续物理空间的固定大小的一个文件,对日志文件的读写基本上是顺序读写,寻址操作甚少。

而buffer pool中的表数据多而复杂:多个表的数据文件在磁盘中的存储空间是不同的,具有随机性,若每次更新buffer pool中的数据到磁盘,每次操作的表空间表现出随机性,对磁盘的读写也是随机的,这样以来频繁的寻址读写操作,将使磁盘处于一个繁忙随机读写状态。

所以buffer pool的策略也使得整体io性能得到了提升。

转载请注明出处:http://www.cnblogs.com/iamsupercp/  ,谢谢合作

MySQL中MyISAM引擎及InnoDB引擎的缓存优化设计的更多相关文章

  1. mysql中MyISAM与InooDB存储引擎的区别

    MyISAM存储引擎特点 不支持事务 表级锁定 读写相互阻塞,写入不能读,读时不能写 只缓存索引 不支持外键约束 不支持聚簇索引 读取数据较快,占用资源较少 不支持MVCC(多版本并发控制机制)高并发 ...

  2. MySQL中MyISAM为什么比InnoDB查询快

    大家都知道在MySQL中,MyISAM比InnoDB查询快,但很多人都不知道其中的原理. 今天我们就来聊聊其中的原理,另外也验证下是否MyISAM比InnoDB真的查询快. 在探索其中原理之前,我们先 ...

  3. MySQL中MyISAM和InnoDB两种主流存储引擎的特点

    一.数据库引擎(Engines)的概念 MySQ5.6L的架构图: MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎.MySQL的所有逻辑概念,包括SQL ...

  4. MySQL中MyISAM引擎与InnoDB引擎性能简单测试

    [硬件配置]CPU : AMD2500+ (1.8G)内存: 1G/现代硬盘: 80G/IDE[软件配置]OS : Windows XP SP2SE : PHP5.2.1DB : MySQL5.0.3 ...

  5. 辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作

    对于mysql中的数据碎片,事实上和我们删除数据是息息相关的,删除数据的时候必定会在数据文件里造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间.假设在一段时间内的大量的删除操作,会 ...

  6. 【mysql中myisam和innodb的区别】

    单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...

  7. MySQL 启动时禁用了 InnoDB 引擎的解决方法

    今天在从本地数据库复制表数据到虚拟机 CentOS 6.6 上的数据库时,得到提示: Unknown table engine 'InnoDB' 于是在服务器 MySQL 中查看了引擎: mysql& ...

  8. MySQL中四种常用存储引擎的介绍

    MySQL常用的四种引擎的介绍 (1):MyISAM存储引擎: 不支持事务.也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 ...

  9. MYSQL 中 MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

随机推荐

  1. HDU 4870 Rating(高斯消元 )

    HDU 4870   Rating 这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP ...

  2. Android - 应用名称设置的问题

    今天我想修改我的android应用名称,就是手机桌面上图标下面的名称,根据我的理解我修改AndroidManifest.xml文件中application标签中的android:label=" ...

  3. Find mac address

    Windows Method 1: Using the Command Prompt 1 Click on the Start button.   2 Type cmd in the search b ...

  4. Error opening trace file: No such file or directory (2)

    想看sharepreference保存的键值对的数据,用到单元测,运行函数总是报这种错,且看不到file explorer-->data>对应工程包的xml文件:

  5. (剑指Offer)面试题15:链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...

  6. JavaScript要点(十七) Math 对象

    来源:JavaScript 参考手册 Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). 语法 var ...

  7. POJ3928、LA4329【树状数组】

    借此题试验一下各种做法的效果~ 这题为ACM2008北京站某题,介于简单与中等之间,做出来,罚时不多基本可以铜了,所以这样的题还必须得会,进阶之路. add(a[i]+1,1)这样处理之后,再用sum ...

  8. 20 个用于处理页面滚动效果的 jQuery 插件

    对设计和开发一个网站来说,web开发者不能低估了网站滚动效果的重要性.如今,设计者们都视为一大挑战了,在网站中设计出吸引眼球的高效视觉滚动效果.幸运的是有各种各样的jquery 滚动插件可供他们使用, ...

  9. 10 个基于 jQuery 的 Web 交互插件推荐

    英文原文:10 jQuery for Web Interaction Plugins “用户交互”在现代的 Web 设计中占据了很大比例,这是互联网产品不可或缺的关键,对 Web 设计师也提出了更高的 ...

  10. 数据库的应用——直接从内存中读取osg节点 (转)

    数据库的应用——直接从内存中读取osg节点 目的:要从数据库中读取节点数据到osg. 一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件 ...