一、 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文件。