mysql缓存、存储引擎

一、         mysql查询缓存

查询缓存不是mysql的子系统,却是查询优化和执行子系统不可缺少的组成部分。它不仅可以缓存查询结果,还可以缓存查询结果本身。如果某个查询的结果就在缓存里, 系统就可以直接取出那些数据返回给客户端而跳过整个查询优化和执行阶段;这对那些使用频繁的查询来说效果尤其显著。这技术是mysql独有的,其他数据库只缓存查询,不缓存查询结果。查询缓存还必须能够处理查询结果变“脏”的情况,即数据在上次查询后发生了一些变化,以及及时不时地对被缓存的查询进行清理。

查询缓存是默认打开的,若你想关闭查询缓存功能,可以使用SQL_NO_CACHE SELECT(相对应的SQL_CACHE SELECT) 选项:SELECT SQL_NO_CACHE id,lname from myCustomer;。

二、         缓存与缓冲区

缓存和缓冲区子系统负责保证使用频率最高的数据(或结构)能够以最有效的方式被访问。换句话说,使用频率最高的数据必须随时驻留在内存里待用。

2.1 表缓存

表缓存(table cache)是为了最大限度的打开、读取和关闭表(磁盘上的.FRM文件)的开销而创建的。因此,表缓存的主要用途就是把关于表的元数据保存在内存里。这可以大大加快有关线程读取表结构信息的速度而无需每次都打开文件。每个线程都有它自己的表缓存结构表,因而可以独立于其他线程对表进行访问,即使某个线程改变了某个表的模式(但还没有提交那些修改),另一个线程可以继续按照原来的模式使用该表。这种结构是一个封装表的所有元数据信息的简单结构,这些结构在内存里以链表的形式存放并与各线程相关。

2.2 记录缓存

记录缓存(record cache)是为了加快存储引擎的顺序读性能而创建的。因此,记录缓存通常只用在表扫描期间。它就像是一个预读缓冲区,每次检索一个数据块,从而减少扫描期间的磁盘访问次数。一般来说,磁盘访问次数越少,就意味着性能越高。有意思的是,mysql在顺序写数据的时候也要用到记录缓存:先把新数据(或修改后的数据)写入记录缓存,等它写满时再把全部数据写到磁盘上。这样一来,写性能也得到了改善。因为记录缓存可以打幅度提高顺序读/写(称为引用的局域性)的性能,所以它最经常与MyISAM存储引擎(但并非局限于此)配合使用。记录缓存是以一种不可知的方式实现的,与用来访问存储引擎API的代码互不干扰。因为记录缓存是在API各层的内部实现的,所以程序员无需采用任何额外步骤就可以享受到记录缓存的好处。

2.3 键缓存

键缓存(key cache)其实就是一个用来缓存索引数据的缓冲区,其内存是一个来自索引文件(B+树)的数据块;只有MyISAM表(磁盘上的.MYI)才使用键缓存。索引本身被封装在键缓存结构里,这些结构在内存里被存储为一个链表。在第一次打开一个MyISAM表时,系统会为它创建一个键缓存。那么,系统又是如何知道哪些索引块被使用过了呢?

缓存有它自己的监控机制,该机制随时记录各索引块的使用频率。键缓存用来记录各索引块的“热度”。在此,热度指索引块被使用了多少次。当某个索引块变“冷”,另一个索引块变“热”时,后者就被读入键缓存而取代前者。这种做法其实是一种“最近最少使用”(LRU)页面交换策略。当一个“脏”索引块被交换出内存时,它的数据被写入磁盘上的索引文件。若被清理的是一个“干净”的索引块,只要从内存里删除就完事了。

2.4 权限缓存

权限缓存(privilege cache)用来存放用户帐户的授权数据。权限缓存里的数据是在用户登录上机和初始化期间从各有关权限表里读出并集中到权限缓存里的。

2.5 主机名缓存

主机名缓存(hostname cache)是另外一种辅助性的缓存机制,与权限缓存很类似。它也被实现为一种以结构为元素的栈。这个缓存的内容是与服务器相连接的所有主机名

2.6 其他缓存机制

Mysql的源代码里还有许多随处可见的小缓存机制,用在复杂的联结操作里的联结缓冲区就是其中一个例子。Eg:有些联结操作需要把第一个表的一条记录与第二个表里的所有记录进行比较。在这类场合,用一个缓存来存储那些记录可以大大加快联结操作的速度而无需反复多次的把第二个表的记录读入内存。

三、         通过插件式存储引擎访问文件

插件式存储引擎使得mysql系统可以灵活地适应各种数据或文件的存储和检索机制。主要有:MyISAM,InnoDB,NDB,Archive,Federated,Memory,Merge,Partner,Community,Custom等。

插件式存储引擎使得数据库专家可以根据具体应用程序的需要为他们的数据库选择一种性能最佳的存储引擎,比如说:为用于事务处理的数据库选用具备各事务控制能力的存储引擎,为读取频繁但很少被修改的表(例如字典表)选用内存存储引擎等。

插件式存储引擎最吸引人的地方是允许你在一个给定的数据库为每个表指定一个不同的存储引擎,你甚至可以在创建一个表之后改变他的存储引擎。这种灵活性和模块化使得数据库的实现者可以随时根据需要创建新的存储引擎。比如下面这条命令可以用来改变某个表的存储引擎:

ALTER TABLE MyTable

ENGINE = InnoDB;

也可以通过修改服务器配置变量STORAGE_ENGINE的办法来改变mysql的默认存储引擎。

3.1 MyISAM

MyISAM存储引擎是mysql的默认文件访问机制,在创建时没有在CREATE语句里明确设置ENGINE选项的所有表都将使用这种存储引擎。此外,MyISAM还为并发操作准备了表级的锁定机制:当某个进程对某个表进行更新操作时,在这个操作完成之前,其他进程将不能访问该表里的任何数据。MyISAM的优点是可靠性高、适用范围广、数据检索速度快。在强调数据检索速度(读性能)的场合,MyISAM是首选的存储引擎。

ISAM的最大优点是索引非常小,绝大多数ISAM表的索引可以全部放在内存的索引缓存区里,所以搜索起来非常快。

3.2 InnoDB

InnoDB 几乎总是用在需要支持事务处理的应用里。InnoDB支持传统的ACID(原子性、一致性、隔离性、耐久性)事务处理原则和外键约束机制。InnoDB所有索引都采用B-树结构——把索引放在叶结点里。InnoDB改进了MyISAM的并发控制,可以提供行级的锁定。在强调可靠性和支持事务处理的场合,InnoDB是首席的存储引擎。

3.3 BDB

BDB存储引擎被认为是InnoDB的更新换代产品,支持事务以及COMMIT和ROLLBACK等额外的事务功能。BDB支持散列表、B-树、简单的基于记录编号的存储机制和永久查询。但是在不久的将来,BDB也许会成为不被支持的存储引擎(不明白?)。

3.4 内存

内存存储引擎(memory storage engine)(有时被称为HEAP表)是一种驻留在内存的表,它使用了一种散列机制来加快常用数据的检索速度这种表比存储在磁盘上的表快很多。他们在使用上与其他存储引擎没有什么不同,只不过数据是存储在内存里并只在mysql会话期间有效而已。在系统关机(或崩溃)时,HEAP表里的数据将丢失。内存存储引擎特别适合用来存储那些访问频繁但很少需要修改的静态数据,比如邮政编码、国家、地区、产品目录之类的字典表等。HEAP表还可以用在那些利用快照技术提供分布式或历史数据访问服务的数据库。

3.5 合并

合并存储引擎(merge storage engine)是用一种有着相同结构(元组布局或模式)的MyISAM表建立的,其效果是那些表可以被当作一个单个大表来使用。那些表按照他们各自的位置来区分。并不需要使用额外的分区机制。所有的表必须驻留在同一台机器上(通过同一个服务器访问)。用户只需要使用单个操所或SELECT、UPDATE、INSERT和DELETE等语句就可以访问到那些表里的全部数据。幸好,对合并表发出的DROP命令只解除那些表的合并关系,并不会改变那些最初的表。

这种表类型的最大优点是速度。利用合并存储引擎,可以把一个大表分成几个较小的表并保存在不同的磁盘上,在通过一些合并表规则把他们合并起来以便同时对他们进行访问。但合并存储引擎有下面几个缺点

A、 合并存储引擎的范围限制在了MyISAM表上。

B、 不允许进行替换操作

C、 与一个普通的表相比,使用索引去访问一个合并表的效率要低一些

合并存储机制适合用在特大型数据库应用里,比如一个因为数据量太大而需要把数据分散到多个表、甚至是多个数据库里去的数据仓库。

3.6 档案

档案存储引擎(archive storage engine)是一种把大量数据保存为某种压缩格式的机制。档案存储机制最适合用来存放和检索那些不需要频繁访问的档案性或历史积累性的数据。

档案存储引擎没有提供任何索引机制,唯一的访问办法是扫描整个表。因此,档案存储引擎不适合用于日常的数据库存储和检索操作。

3.7 联合

联合存储引擎(fedreted storage engine)是一种用来从多个数据库系统创建一个表的机制。联合存储引擎的工作情况与合并存储引擎很相似,但他还允许你把来自多个数据库服务器的数据(表)链接在一起。这个机制的主要用途也正是把来自其他数据库系统的表链接起来。联合存储引擎最适合用在分布式环境或数据仓库环境里。

联合存储引擎最吸引人的地方是它不移动数据,也不要求远程的表是同一种存储引擎,联合存储引擎会在存储和检索有关数据的过程中自动完成必要的转换。这充分体现了插件式存储引擎层的强大威力。

3.8 群集/NDB

群集存储引擎(cluster storage engine)(在需要与集簇产品相区别的场合称为NDB)为mysql提供了集群服务器的能力。群集存储引擎的基本用途是在一个高可用和高性能的环境里集中使用多个mysql服务器提供数据库服务。群集存储引擎不存储任何数据,具体的数据存储和检索操作由群集里的各有关数据库所使用的存储引擎负责执行,群集存储引擎只负责控制如何把数据分布到群集簇中的哥哥数据库以提供冗余和改善性能。NDB存储引擎还提供了一个API供人们创建可扩展的群集解决方案。

3.9 csv

Csv存储引擎用来创建和读写csv格式的表文件。Csv存储引擎不需要把数据复制为另一种格式,csv表的元数据将他的文件名一起直接保存在服务器上的数据库文件夹里。Csv存储引擎可以让数据库用户快速方便的使用由电子表格软件生成的结构化商务数据。Csv存储引擎没有提供任何索引机制。

3.10 黑洞

黑洞存储引擎(blackhole storage engine)允许系统写数据,但并不把写入的数据真正保存起来。不过,若激活了二进制日志功能,有关的sql语句将被记载到日志里。在只想测试一下某个应用以确保它是在写数据,而不是想把那些数据真正保存起来的场合,这种存储引擎非常方便。

3.11 定制

定制存储引擎(custom storage engine)是你为改进数据库服务器而自行创建的任何一种存储引擎。比如说,你想创建一个存储引擎来读取XML文件。

时间: 2024-11-05 15:52:29

mysql缓存、存储引擎的相关文章

mysql 的存储引擎介绍

在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库.而在设计表的时候,我们都会关注一个问题,使用什么存储引擎.等一下,存储引擎?什么是存储引擎? 什么是存储引擎? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能. 例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL

MySQL各存储引擎特点及选择建议

Mysql官方存储引擎比较常见的存储引擎有:Innodb.MyISAM.Memory.Archive.NDB.BDB,第三方比较有名的:TokuDB.Infobright.InnfiniDB.XtraDB(Innodb增强版本) 官方存储引擎的特点对比 MySQL存储引擎比较 特性 MyISAM InnoDB Memory Archive NDB BDB 存储限制   No   64TB   Yes   No   Yes    No 事务   √      √ MVCC   √  √   √  

mysql数据库存储引擎及区别

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERATED.ARCHIVE.CSV.BLACKHOLE. mysql的存储引擎包括:MyISAM.InnoDB.BDB.MEMORY.MERGE.EXAMPLE.NDBCluster.ARCHIVE.CSV.BLACKHOLE.FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是

Mysql运维管理-MySQL数据库存储引擎知识19

1.MySQL 引擎概述 1.1 什么是存储引擎 我们在录制一个视频文件的时候,可以转换成不同的格式如mp4,avi,wmv等,而且在电脑的磁盘上也会存在于不同类型的文件系统windows里常见的ntfs,fat32,存在于linux操作系统里常见的ext3,ext4,xfs.但是跟我们呈现的内容都是一样的,直观的区别是占用系统空间的大小与清晰程度不一样.那么数据库存储引擎也有很多种存储方式.无论用什么存储引擎来存储,用户看到的数据都是一样的.不同的引擎存储,引擎功能,占用的空间的大小,读取性能

[转帖]mysql常用存储引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介绍与如何选择

mysql常用存储引擎(InnoDB.MyISAM.MEMORY.MERGE.ARCHIVE)介绍与如何选择原创web洋仔 发布于2018-06-28 15:58:34 阅读数 1063 收藏展开 https://blog.csdn.net/CSDN___LYY/article/details/80844606 一:前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的

MySQL数据库存储引擎

MySQL数据库存储引擎 MySQL数据库是一种关系型数据库,数据时存放在数据库中的一张一张的表中的,各个表之间或有关联,表中的每行相关,每列是不相关.这是关系型数据库的基本存储方式. MySQL存储引擎是为了在各种不同的条件下对数据存放的可靠性.关联性.读写等方面做出的一个可供选择的存储模式. 当前使用较多的MySQL存储引擎主要有以下几个,MyISAM,InnoDB,BdB,Memory等,这些存储引擎主要在以下几个方面有所区分,锁定水平.处理方式.存储方式和索引技巧方面有所不同. mysq

mysql innodb存储引擎的聚集索引

InnoDB聚集索引 MySQL有没有支持聚集索引,取决于采用哪种存储引擎. MySQL InnoDB一定会建立聚集索引,所谓聚集,指实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚集索引,即MySQL不会一次把数据行保存在二个地方.InnoDB通常根据主键值(primary key)进行聚集,但是当一个表没有PK怎么办?InnoDB选取聚集索引参照列的顺序是: 1.如果声明了主键(primary key),则这个列会被做为聚集索引2.如果没有声明主键,则会用一个唯一且不为空的索引

Mysql的存储引擎介绍

下面主要介绍InnoDB.MyISAM和MEMEORY三种存储引擎. InnoDB存储引擎 InnoDB遵循CNU通用公开许可(GPL)发行.InnoDB已经被一些重量级互联网公司所采用,如雅虎.Slashdot和Google,为用户操作非常大的数据库提供了一个强大的解决方案.InnoDB给MySQL的表提供了事务.回滚.崩溃修复能力和多版本并发控制的事务安全.MySQL从3.23.34a开始包含InnoDB存储引擎.InnoDB是MySQL上第一个提供外键约束的表引擎,而且InnoDB对事务处

mysql数据库存储引擎(1)

mysql的存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式. 首先我们可以查看mysql支持的存储引擎: mysql> show engines; +------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine     | Support | Comment        

MySQL MERGE存储引擎 简介

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义. 假设你有几个日志数据表,他们内容分别是这几年来每一年的日志记录项,他们的定义都是下面这样,YY代表年份: [sql]CREATE TABLE log_YY ( dt DATETIME NOT NULL, info VA