MySql数据引擎简介与选择方法
一、数据引擎简介
在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插件式存储引擎体系结构:
二、选择存储引擎
与mysql一起提供的各种存储引擎在设计时考虑了不同的使用情况。为了更有效地使用插件式存储体系结构,最好了解各种存储引擎的优点和缺点。
在下面的表格中,概要介绍了与mysql一起提供的存储引擎:
下述存储引擎是最常用的:
· 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引擎(可为快速创建定制的插件式存储引擎提供帮助)。
请记住,对于整个服务器或方案,你并不一定要使用相同的存储引擎,你可以为方案中的每个表使用不同的存储引擎,这点很重要。
三、将存储引擎指定给表
可以在创建新表时指定存储引擎,或通过使用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文件。单独的存储引擎创建任何需要用来管理表的额外文件。
一个数据库可以包含不同类型的表。
四、存储引擎和事务
下述存储引擎支持事务:
· innodb:通过mvcc支持事务,允许commit、rollback和保存点。
· ndb:通过mvcc支持事务,允许commit和rollback。
· bdb:支持事务,允许commit和rollback。
事务安全表(tst) 比起非事务安全表 (ntst)有几大优势:
· 更安全。即使mysql崩溃或遇到硬件问题,要么自动恢复,要么从备份加事务日志恢复,你可以取回数据。
· 你可以合并许多语句,并用commit语句同时接受它们全部(如果autocommit被禁止掉)。
· 你可以执行rollback来忽略你的改变(如果autocommit被禁止掉)。
· 如果更新失败,你的所有改变都变回原来。(用非事务安全表,所有发生的改变都是永久的)。
· 事务安全存储引擎可以给那些当前用读得到许多更新的表提供更好的部署。
非事务安全表自身有几个优点,因为没有事务开支,所有优点都能出现:
· 更快
· 需要更少的磁盘空间
· 执行更新需要更少的内存
你可以在同一个语句中合并事务安全和非事务安全表来获得两者最好的情况。尽管如此,在autocommit被禁止掉的事务里,变换到非事务安全表依旧即时提交,并且不会被回滚。
虽然mysql支持数个事务安全存储引擎,为获得最好结果,你不应该在一个事务那混合不同表类型。如果你混合表类型会发生问题,
五、插入搜索引擎
能够使用存储引擎之前,必须使用install plugin语句将存储引擎plugin(插件)装载到mysql。例如,要想加载example引擎,首先应加载ha_example.so模块:
install pluginha_examplesoname 'ha_example.so';
文件.so必须位于mysql服务器库目录下(典型情况下是installdir/lib)。
六、拔出存储引擎
要想拔出存储引擎,可使用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;