MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其余存储引擎比较,MyISAM具备检查和修复表格的大多数工具. MyISAM表格能够被压缩,并且它们支持全文搜索.它们不是事务安全的,并且也不支持外键。若是事物回滚将形成不彻底回滚,不具备原子性。若是执行大量 的SELECT,MyISAM是更好的选择。
InnoDB:这种类型是事务安全的.它与BDB类型具备相同的特性,它们还支持外键.InnoDB表格速度很快.具备比BDB还丰富的特性,所以若是须要一个事务安全的存储引擎,建议使用它.若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表, 对于支持事物的InnoDB类型的表,影响速度的主要缘由是AUTOCOMMIT默认设置是打开的,并且程序没有显式调用BEGIN 开始事务,致使每插入一条都自动Commit,严重影响了速度。能够在执行sql前调用begin,多条sql造成一个事物(即便autocommit打 开也能够),将大大提升性能
MySQL引擎简介
MySQL是咱们比较经常使用的一种数据库软件。它有着诸多的优势,如开源的,免费的等等。其实它还有一个很好的特色,那就是有多种引擎能够供你选择。若是赛车手能根据不一样的路况,地形随手更换与之最适宜的引擎,那么他们将创造奇迹。然而目前他们还作不到那样便捷的更换引擎,可是咱们却能够!
所谓知己知彼方可百战不殆,要想将它们发挥到极致,首先咱们应该来认识一下MySQL提供给咱们的这几种引擎。
通常来讲,MySQL有如下几种引擎:ISAM、MyISAM、HEAP、InnoDB和Berkley(BDB)。注意:不一样的版本支持的引擎是有差别的。固然啦,若是你感受本身的确技术高超,你还可以使用MySQL++来建立本身的数据库引擎,这个已经out of my knowledge,牛人能够参照MySQL++ API帮助来实现。下面逐一叙述这5种引擎各自的特性:
ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。所以,ISAM执行读取操做的速度很快,并且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不可以容错:若是你的硬盘崩溃了,那么数据文件就没法恢复了。若是你正在把ISAM用在关键任务应用程序里,那就必须常常备份你全部的实时数据,经过其复制特性,MySQL可以支持这样的备份应用程序。
MyISAM
MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操做。其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的MyISAMPack工具。
MyISAM强调了快速读取操做,这可能就是为何MySQL受到了Web开发如此青睐的主要缘由:在Web开发中你所进行的大量数据操做都是读取操做。因此,大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider,IPP)只容许使用MyISAM格式。
HEAP
HEAP容许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MyISAM都快,可是它所管理的数据是不稳定的,并且若是在关机以前没有进行保存,那么全部的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你须要使用SELECT表达式来选择和操控数据的时候很是有用。要记住,在用完表格以后就删除表格。让我再重复一遍:在你用完表格以后,不要忘记删除表格。
InnoDB和Berkley DB
InnoDB和Berkley DB(BDB)数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MySQL++ API。在使用MySQL的时候,你所面对的每个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MyISAM引擎慢不少,可是InnoDB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,若是你的设计须要这些特性中的一者或者二者,那你就要被迫使用后两个引擎中的一个了。
认识完了这么多的引擎,咱们也知道了它们应该在什么状况下拿来应急,那么接着咱们就要学会如何来更换这些引擎了。
Globle:一种最简单的方法就是更改服务器配置,直接将其设置成你所须要的引擎。这个在win下经过更改服务器安装目录下的mysql.ini中的default-storage-engine项便可,也能够经过运行MySQL Server Instance Configuration Wizard作简单的设置。
Per Table:除了全局的方法外,还有一种更灵活的配置方法,那就是按表来设置引擎,这样咱们就能够把那些须要用到事务处理的表设置成InnoDB,其余设置成MyISAM,将性能提高到极致,这是否是很使人兴奋呢?设置方法也比较简单:
一、你能够在Create Table语句的最后添加扩展语句,如TYPE=MyISAM(或者ENGINE = INNODB)来指定当前标的引擎类型。也能够用Alter语句在创建表个后进行更改。当你不清楚当前数据库中各表的引擎时可使用SHOW TABLE STATUS FROM DBname来查看。
二、使用随MySQL服务器发布同时提供的MySQL客户端来建立表,在建立时能够选择使用的存储引擎。
不一样的引擎选择在不一样的业务处理上,性能将有天壤之别!!
题外话:
要想服务器性能达到最佳,在配置服务器时也须要好好考虑。若是是在Win下那么能够经过运行MySQL Server Instance Configuration Wizard来设置,它将引导你设置当前服务器的类型等等信息。
还有再有大量数据须要插入的时候能够考虑使用INSERT DELAYED语句(具体语法参考MySQL手册)。当一个客户端使用INSERT DELAYED时,会马上从服务器处获得一个肯定。而且行被排入队列,当表没有被其它线程使用时,此行被插入。使用INSERT DELAYED的另外一个重要的好处是,来自许多客户端的插入被集中在一块儿,并被编写入一个块。这比执行许多独立的插入要快不少。固然它也有其适用范围,具体参考手册,我就再也不赘述了。
1、数据引擎简介
在MySQL 5.1中,MySQL AB引入了新的插件式存储引擎体系结构,容许将存储引擎加载到正在运新的MySQL服务器中。
使用MySQL插件式存储引擎体系结构,容许数据库专业人员为特定的应用需求选择专门的存储引擎,彻底不须要管理任何特殊的应用编码要求。采用MySQL服务器体系结构,因为在存储级别上提供了一致和简单的应用模型和API,应用程序编程人员和DBA可再也不考虑全部的底层实施细节。所以,尽管不一样的存储引擎具备不一样的能力,应用程序是与之分离的。
MySQL支持数个存储引擎做为对不一样表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:
· MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在全部MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另一个引擎。
· MEMORY存储引擎提供“内存中”表。MERGE存储引擎容许集合将被处理一样的MyISAM表做为一个单独的表。就像MyISAM同样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。
注释:MEMORY存储引擎正式地被肯定为HEAP引擎。
· InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操做系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在全部MySQL 5.1二进制分发版里,你能够按照喜爱经过配置MySQL来容许或禁止任一引擎。
· EXAMPLE存储引擎是一个“存根”引擎,它不作什么。你能够用这个引擎建立表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。一样,它的主要兴趣是对开发者。
· NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在将来的MySQL分发版中,咱们想要添加其它平台对这个引擎的支持,包括Windows。
· ARCHIVE存储引擎被用来无索引地,很是小地覆盖存储的大量数据。
· CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。
· BLACKHOLE存储引擎接受但不存储数据,而且检索老是返回一个空集。
· FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一块儿工做,使用MySQL C Client API。在将来的分发版中,咱们想要让它使用其它驱动器或客户端链接方法链接到另外的数据源。
插件式存储引擎体系结构提供了标准的管理和支持服务集合,它们对全部的基本存储引擎来讲是共同的。存储引擎自己是数据库服务器的组件,负责对在物理服务器层面上维护的基本数据进行实际操做。
这是一种高效的模块化体系结构,它为那些但愿专一于特定应用需求的人员提供了巨大的便利和益处,这类特殊应用需求包括数据仓储、事务处理、高可用性情形等,同时还能利用独立于任何存储引擎的一组接口和服务。
应用程序编程人员和DBA经过位于存储引擎之上的链接器API和服务层来处理MySQL数据库。若是应用程序的变化须要改变底层存储引擎,或须要增长1个或多个额外的存储引擎以支持新的需求,不须要进行大的编码或进程更改就能实现这类要求。MySQL服务器体系结构提供了一致和易于使用的API,这类API适用于多种存储引擎,经过该方式,该结构将应用程序与存储引擎的底层复杂性隔离开来。
在下图中,以图形方式介绍了MySQL插件式存储引擎体系结构:
The MySQL pluggable storage engine architecture
2、选择存储引擎
与MySQL一块儿提供的各类存储引擎在设计时考虑了不一样的使用状况。为了更有效地使用插件式存储体系结构,最好了解各类存储引擎的优势和缺点。
在下面的表格中,概要介绍了与MySQL一块儿提供的存储引擎:
Storage engine comparison
下述存储引擎是最经常使用的:
· MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其余应用环境下最常使用的存储引擎之一。注意,经过更改STORAGE_ENGINE配置变量,可以方便地更改MySQL服务器的默认存储引擎。
· InnoDB:用于事务处理应用程序,具备众多特性,包括ACID事务支持。
· BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其余事务特性。
· Memory:将全部数据保存在RAM中,在须要快速查找引用和其余相似数据的环境下,可提供极快的访问。
· Merge:容许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一块儿,并做为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。
· Archive:为大量不多引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
· Federated:可以将多个分离的MySQL服务器连接起来,从多个物理服务器建立一个逻辑数据库。十分适合于分布式环境或数据集市环境。
· Cluster/NDB:MySQL的簇式数据库引擎,尤为适合于具备高性能查找要求的应用程序,这类查找需求还要求具备最高的正常工做时间和可用性。
· Other:其余存储引擎包括CSV(引用由逗号隔开的用做数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速建立定制的插件式存储引擎提供帮助)。
请记住,对于整个服务器或方案,你并不必定要使用相同的存储引擎,你能够为方案中的每一个表使用不一样的存储引擎,这点很重要。
3、将存储引擎指定给表
能够在建立新表时指定存储引擎,或经过使用ALTER TABLE语句指定存储引擎。
要想在建立表时指定存储引擎,可以使用ENGINE参数:
CREATE TABLE engineTest(
id INT
) ENGINE = MyISAM;
也可使用TYPE选项到CREATE TABLE语句来告诉MySQL你要建立什么类型的表。
CREATE TABLE engineTest(
id INT
) TYPE = MyISAM;
虽然TYPE仍然在MySQL 5.1中被支持,如今ENGINE是首选的术语。
若是你省略掉ENGINE或TYPE选项,默认的存储引擎被使用。通常的默认是MyISAM,但你能够用--default-storage-engine或--default-table-type服务器启动选项来改变它,或者经过设置storage_engine或table_type系统变量来改变。
要想更改已有表的存储引擎,可以使用ALTER TABLE语句:
ALTER TABLEengineTestENGINE =ARCHIVE;
ALTER TABLE t ENGINE = MYISAM;
ALTER TABLE t TYPE = BDB;
若是你试着使用一个未被编译进MySQL的存储引擎,或者试着用一个被编译进MySQL但没有被激活的存储引擎,MySQL取而代之地建立一个MyISAM类型的表。当你在支持不一样存储引擎的MySQL服务器之间拷贝表的时候,上述的行为是很方便的。(例如,在一个复制创建中,可能你的主服务器为增长安全而支持事务存储引擎,但从服务器为更快的速度而仅使用非事务存储引擎。)
在不可用的类型被指定时,自动用MyISAM表来替代,这会对MySQL的新用户形成混淆。不管什么时候一个表被自动改变之时,产生一个警告。
MySQL老是建立一个.frm文件来保持表和列的定义。表的索引和数据可能被存储在一个或多个文件里,这取决于表的类型。服务器在存储引擎级别之上建立.frm文件。单独的存储引擎建立任何须要用来管理表的额外文件。
一个数据库能够包含不一样类型的表。
4、存储引擎和事务
下述存储引擎支持事务:
· InnoDB:经过MVCC支持事务,容许COMMIT、ROLLBACK和保存点。
· NDB:经过MVCC支持事务,容许COMMIT和ROLLBACK。
· BDB:支持事务,容许COMMIT和ROLLBACK。
事务安全表(TST) 比起非事务安全表 (NTST)有几大优点:
· 更安全。即便MySQL崩溃或遇到硬件问题,要么自动恢复,要么从备份加事务日志恢复,你能够取回数据。
· 你能够合并许多语句,并用COMMIT语句同时接受它们所有(若是autocommit被禁止掉)。
· 你能够执行ROLLBACK来忽略你的改变(若是autocommit被禁止掉)。
· 若是更新失败,你的全部改变都变回原来。(用非事务安全表,全部发生的改变都是永久的)。
· 事务安全存储引擎能够给那些当前用读获得许多更新的表提供更好的部署。
非事务安全表自身有几个优势,由于没有事务开支,全部优势都能出现:
· 更快
· 须要更少的磁盘空间
· 执行更新须要更少的内存
你能够在同一个语句中合并事务安全和非事务安全表来得到二者最好的状况。尽管如此,在autocommit被禁止掉的事务里,变换到非事务安全表依旧即时提交,而且不会被回滚。
虽然MySQL支持数个事务安全存储引擎,为得到最好结果,你不该该在一个事务那混合不一样表类型。若是你混合表类型会发生问题,
5、插入搜索引擎
可以使用存储引擎以前,必须使用INSTALL PLUGIN语句将存储引擎plugin(插件)装载到mysql。例如,要想加载example引擎,首先应加载ha_example.so模块:
INSTALL PLUGINha_exampleSONAME 'ha_example.so';
文件.so必须位于MySQL服务器库目录下(典型状况下是installdir/lib)。
6、拔出存储引擎
要想拔出存储引擎,可以使用UNINSTALL PLUGIN语句:
UNINSTALL PLUGINha_example;
若是拔出了正被已有表使用的存储引擎,这些表将成为不可访问的。拔出存储引擎以前,请确保没有任何表使用该存储引擎。
为了安装插件式存储引擎,plugin文件必须位于恰当的MySQL库目录下,并且发出INSTALL PLUGIN语句的用户必须具备SUPER权限。
建立table时能够经过engine关键字指定使用的存储引擎,若是省略则使用系统默认的存储引擎:
CREATE TABLE t (i INT) ENGINE = MYISAM;
查看系统中支持的存储引擎类型:
mysql> show engines;
标准安装程序中只提供部分引擎的支持,若是须要使用其余的存储引擎,须要使用源代码加不一样的参数从新编译。其中DEFAULT代表系统的默认存储引擎,能够经过修改配置参数来变动:
default-storage-engine=MyISAM
查看某个存储引擎的具体信息
mysql> show engine InnoDB status/G;mysql