1、 mysql查询缓存mysql
查询缓存不是mysql的子系统,倒是查询优化和执行子系统不可缺乏的组成部分。它不只能够缓存查询结果,还能够缓存查询结果自己。若是某个查询的结果就在缓存里, 系统就能够直接取出那些数据返回给客户端而跳过整个查询优化和执行阶段;这对那些使用频繁的查询来讲效果尤为显著。这技术是mysql独有的,其余数据库只缓存查询,不缓存查询结果。查询缓存还必须可以处理查询结果变“脏”的状况,即数据在上次查询后发生了一些变化,以及及时不时地对被缓存的查询进行清理。程序员
查询缓存是默认打开的,若你想关闭查询缓存功能,可使用SQL_NO_CACHE SELECT(相对应的SQL_CACHE SELECT) 选项:SELECT SQL_NO_CACHE id,lname from myCustomer;。sql
2、 缓存与缓冲区数据库
缓存和缓冲区子系统负责保证使用频率最高的数据(或结构)可以以最有效的方式被访问。换句话说,使用频率最高的数据必须随时驻留在内存里待用。缓存
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:有些联结操做须要把第一个表的一条记录与第二个表里的全部记录进行比较。在这类场合,用一个缓存来存储那些记录能够大大加快联结操做的速度而无需反复屡次的把第二个表的记录读入内存。
3、 经过插件式存储引擎访问文件
插件式存储引擎使得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文件。