数据库引擎是存储、处理和保护数据的核心服务。数据库引擎可以控制访问权限,快速处理事务,从而满足企业中大多数需要处理大量数据的应用的要求。使用数据库引擎为联机事务处理或联机分析处理数据创建关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。您可以使用SQL Server Management Studio来管理数据库对象,使用SQL Server Profiler来捕获服务器事件。

引擎用于将查询语句转换成数据库操作。例如,如果您输入SQL数据库查询语句,其引擎会将SQL语句转换为数据库操作,以在数据库中搜索某个项目。它是用户的界面。不同的语言使用不同的引擎,如JDBC (JAVA数据库连接)、ODBC、JET等。

MySQL数据库引擎取决于MySQL安装时的编译方式。要添加新的引擎,必须重新编译MYSQL。默认情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型,INNODB和BERKLEY(BDB)也可以经常使用。如果技术高超,还可以用MySQL API自制引擎。以下是一些数据库引擎:

Isam: Isam是一种定义良好且经过时间考验的数据表管理方法。它被设计成数据库的查询比更新更频繁。因此,ISAM可以快速执行读取操作,并且不会占用大量内存和存储资源。ISAM的两个主要缺点是它不支持事务处理和不能容忍故障:如果你的硬盘崩溃,数据文件无法恢复。如果您在任务关键型应用程序中使用ISAM,您必须始终备份所有实时数据。MYSQL可以通过其复制特性支持这种备份应用程序。

MyISAM:MyISAM是MySQL的ISAM扩展格式,也是默认的数据库引擎。除了提供大量ISAM没有的索引和字段管理的功能,MyISAM还使用了表锁定机制来优化多个并发读写操作,代价是频繁运行OPTIMIZE TABLE命令来恢复更新机制浪费的空间。MyISAM也有一些有用的扩展,比如用于修复数据库文件的MyISAMCHK工具和用于恢复浪费空间的MyISAMPACK工具。MYISAM强调快速读取操作,这可能是MySQL如此受WEB开发青睐的主要原因:你在WEB开发中做的大量数据操作都是读取操作。因此,大多数虚拟主机提供商和互联网平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷是表损坏后无法恢复数据。

堆:堆允许只存在于内存中的临时表。在内存中使得HEAP比ISAM和MYISAM更快,但它管理的数据不稳定,如果在关机前不保存,所有数据都会丢失。当数据行被删除时,堆不会浪费很多空间。当您需要使用选择表达式来选择和操作数据时,堆表非常有用。请记住,使用完表单后请将其删除。

InnoDB:InnoDB数据库引擎都是让MySQL变得灵活的技术的直接产物,这种技术就是MYSQL API。在使用MYSQL时,您面临的几乎每一个挑战都源于ISAM和MyISAM数据库引擎不支持事务处理或外键。虽然它比ISAM和MyISAM引擎慢得多,但InnoDB包括对事务处理和外键的支持,这在前两个引擎中是不可用的。如前所述,如果您的设计需要这些特性中的一个或两个,您将被迫使用后两个引擎中的一个。

如果你觉得真的很熟练,也可以用MySQL API来创建自己的数据库引擎。这个API为您提供了操作字段、记录、表、数据库、连接、安全帐户的功能,以及构建一个DBMS(如MySQL)所需的其他无数功能。深入解释API已经超出了本文的范围,但是让你了解MySQL API的存在及其可交换引擎背后的技术是非常重要的。据估计,这种插件数据库引擎模型甚至可以用于创建MySQL的本地XML提供程序。(任何一个看了这篇文章的MySQL API开发者都可以把这个作为一个需求。)

MyISAM和InnoDB的区别InnoDB和MyISAM是很多人使用MySQL时最常用的两种表类型。这两种表类型各有优缺点,具体取决于具体的应用。基本区别在于MyISAM类型不支持高级处理,比如事务处理,而InnoDB类型支持。MyISAM类型的表强调性能,比InnoDB类型的表更快,但不提供事务支持,而InnoDB提供了对外键等高级数据库函数的事务支持。

以下是一些细节和具体的实现差异:

1.InnoDB不支持全文类型的索引。

2.InnoDB并不在表中保存具体的行数,也就是说在执行select count(*) fromtable时,InnoDB要扫描整个表来计算有多少行,而MyISAM只需要简单地读取保存的行数即可。请注意,当count(*)语句包含where条件时,两个表的操作是相同的。

3.对于AUTO_INCREMENT类型的字段,InnoDB必须只包含该字段的索引,但是在MyISAM表中,可以与其他字段建立联合索引。

4.从表中删除时,InnoDB不会重建表,而是逐行删除。

5.五号。从主操作加载表不适用于InnoDB。解决方法是先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但不适用于有附加InnoDB特性(比如外键)的表。

此外,InnoDB表的行锁不是绝对的。如果MySQL在执行SQL语句时无法确定要扫描的范围,InnoDB表也会锁定整个表,例如,Update Table Set num=1,其中name类似于“a%”。

这两种类型的主要区别在于Innodb支持事务处理和外键以及行级锁。MyISAM不支持。因此,MyISAM往往容易被认为只适合小项目。

作为一个MySQL用户,我喜欢Innodb和MyISAM,但从我目前的数据库平台需要99.9%的稳定性、便捷的可扩展性和高可用性来看,MyISAM绝对是我的首选。

原因如下:

1、首先,我目前平台上的项目大部分都是读多写少的项目,MyISAM的读性能比Innodb好很多。

2、 my Sam的索引和数据是分离的,索引是压缩的,所以内存利用率也相应提高。可以加载更多的索引,而Innodb是索引和数据紧密捆绑,没有压缩,会让Innodb比MyISAM更大。

3、从平台的角度来说,经常会发生应用程序开发人员不小心更新了一个写在哪里的范围错误的表,导致该表无法正常使用的情况。这时候米沙姆的优越性就体现出来了。只需从当天复制的压缩包中取出表对应的文件,随意放入一个数据库目录,然后转储到sql中,再导入回主库,补上对应的binlog即可。如果是Innodb,恐怕没这么快。不要跟我说通过导出xxx.sql机制让Innodb定期备份,因为我平台上最小的数据库实例的数据量基本都是几十GB。

4、从我接触到的应用逻辑来看,select count(*)和order by是使用频率最高的操作,占sql语句总数的60%以上,这种操作Innodb实际上是锁表的。很多人认为Innodb是行级锁,认为只有where对其主键有效,所有非主键都会锁整个表。

5、也有很多应用部门经常需要我定期给他们某些表格的数据。MyISAM非常方便。把frm的文件发给他们就行了。MYD和MYI对应的那张表,并让他们在相应版本的数据库中启动。Innodb需要导出xxx.sql,因为对方受字典数据文件的影响,仅仅把文件给别人是无法使用的。

6、如果和MyISAM相比进行insert编写,Innodb是达不到MyISAM的编写性能的。如果是基于索引的更新操作,MyISAM可能不如Innodb,但是库能不能赶上也是个问题。最好通过多实例子库和子表架构来解决。

7、如果使用MyISAM,合并引擎可以大大加快应用部门的开发速度。他们只需要对这个合并表做一些selectcount(*)的操作,非常适合某一类业务表(比如行、调查、统计)的总量有几个亿的大项目。

当然,Innodb也不是绝对没有必要。我用Innodb做交易项目,比如模拟股票交易项目。当活跃用户超过20万的时候,应付起来也是非常轻松的。所以我个人比较喜欢Innodb,但是如果从数据库平台的应用入手,还是会从MyISAM入手。

另外,可能有人会说MyISAM无法抵抗太多的写操作,但是我可以通过架构来弥补。先说我现有数据库平台的容量:主从数据总量在几百吨以上,每天有十几亿pv的动态页面。还有几个大项目是通过数据接口调用的,并没有计入总pv(包括一个大项目,初期没有部署,导致单个数据库每天处理9000万次查询)。而我整个数据库服务器的平均负载在0.5-1左右。

一般来说,MyISAM适用于:

(1)做大量的计数计算;

(2)插入不频繁,查询非常频繁;

(3)无业务。

InnoDB适用于:

(1)可靠性要求比较高,或者需要交易;

(2)当表更新和查询相当频繁并且有更大的机会锁定表时,指定创建数据引擎。

使所有的灵活性成为可能的开关是提供给ANSI SQL的MySQL扩展——TYPE参数。MySQL允许您在表级别指定数据库引擎,因此它们有时被称为表格式。以下示例代码显示了如何分别使用MyISAM、ISAM和堆引擎创建表。注意,创建每个表的代码是相同的,除了最后一个类型参数,它用于指定数据引擎。

以下为引用内容:

还可以使用ALTER TABLE命令将原始表从一个引擎移动到另一个引擎。以下代码显示了如何使用ALTER TABLE将MyISAM表移动到InnoDB的引擎:

以下为引用内容:

MySQL使用三个步骤来实现这个目标。首先,创建该表单的副本。然后,对输入数据的任何更改都将排队,并将该副本移动到另一个引擎。最后,队列中的所有数据更改都被发送到新表,而原始表被删除。

如果只是想把表从ISAM更新到MyISAM,可以使用MySQL_convert_table_format命令,而不用编写ALTER TABLE表达式。

您可以使用SHOW TABLE命令(MySQL对ANSI标准的另一个扩展)来确定哪个引擎正在管理特定的表。SHOW TABLE将返回一个包含多个数据列的结果集,您可以使用它来查询和获取各种信息:数据库引擎的名称在Type字段中。以下示例代码说明了SHOW TABLE的用法:

您可以使用SHOW CREATE TABLE [TableName]]来检索SHOW TABLE可以检索的信息。

一般来说,MySQL默认会提供多种存储引擎,可以通过以下来查看:

(1)看看你的MySQL现在已经提供了什么存储引擎:MySQL》show engines;

(2)看看你的MySQL目前默认的存储引擎:MySQL显示类似“% storage _ engine%”的变量;

(3)你需要看一个表用的是什么引擎(显示结果中参数engine后面注明了表当前使用的存储引擎):mysql》显示create table表名;

最后,如果你想用一个没有编译成MySQL或者没有激活的引擎,那是没有用的,MySQL也不会提示你。它将只为您提供一个默认格式的表格(MyISAM)。除了使用默认的表格式,还有一些方法可以让MySQL给出一个错误提示,但是现在,如果您不确定某个特定的数据库引擎是否可用,您应该使用SHOW TABLE来检查表格式。

更多的选择意味着更好的性能。特定表的引擎需要重新编译和跟踪。考虑到这种额外的复杂性,为什么仍然希望使用非默认的数据库引擎呢?答案很简单:调整数据库以满足您的需求。

可以肯定的是,MyISAM确实很快,但是如果你的逻辑设计需要事务处理,你可以自由使用支持事务处理的引擎。再者,因为MySQL可以让你在表级应用数据库引擎,你可以只优化需要事务处理的表的性能,把不需要事务处理的表交给更轻便的MyISAM引擎。对于MySQL来说,灵活性是关键。

特性试验

所有性能测试都是在配有微软视窗xp sp2、英特尔奔腾处理器1.6 ogHz 1g内存的计算机上进行的。

测试方法:连续提交10条查询,表记录总数:380000条,时间单位为s。

MyISAMInnoDB型发动机的性能差异

数到0.0000。38601.88868888861

查询主键0.005708 0.157427.57

查询非主键24.01 80.37 3.348

更新主键0.008124 0.8183100.7

更新非主键0.004141 0.02625 6.338

插入0.004188 0.369488.21

(1)添加索引后,对MyISAM的查询可加速4 206.09733倍,对InnoDB的查询可加速510.72921倍。同时,MyISAM的更新速度减慢到1/2,InnoDB的更新速度减慢到1/30。要看情况决定是否添加索引,比如不查询日志表,不做任何索引。

(2)如果你的数据量是百万级,并且没有事务处理,那么MyISAM是性能的最佳选择。

(3)3)InnoDB表的大小更大,所以MyISAM可以节省大量的硬盘空间。

在我们测试的这个38w的表中,表所占用的空间如下:

发动机类型MyISAM InnoDB

数据53,924 kb 58,976 kb

索引13,640 kb 21,072 kb

它总共占用67,564 KB和80,048 KB的空间。

对于另一个记录为176W百万W的表,该表占用的空间如下:

MyIsam InnorDB型发动机

数据56,166 kb 90,736 kb

索引67,103 kb 88,848 kb

它总共占用123,269 kb和179,584 kb的空间。

其他的

MySQL官方是这样解释InnoDB的:InnoDB为MySQL提供了一个事务安全(ACID兼容)的存储引擎,具有提交、回滚和崩溃恢复的能力。InnoDB在行级别锁定,并在SELECT语句中提供Oracle风格的解锁读取。这些功能提高了多用户部署和性能。没有必要在InnoDB中扩展锁定,因为行级锁定在InnoDB中非常小的空间内。InnoDB还支持外键强制。在SQL查询中,您可以自由地将InnoDB类型的表与其他MySQL表类型混合,甚至在同一个查询中。

InnoDB旨在处理海量数据时实现最高性能,其CPU效率可能是任何其他基于磁盘的关系数据库引擎无法比拟的。

InnoDB存储引擎与MySQL服务器完全集成。InnoDB存储引擎维护自己的缓冲池,用于在主内存中缓存数据和索引。InnoDB将其表和索引存储在一个表空间中,该表空间可以包含几个文件(或原始磁盘分区)。这与MyISAM表不同,例如,在MyISAM表中,每个表都存储在一个单独的文件中。InnoDB表可以是任何大小,即使在文件大小限制为2GB的操作系统上也是如此。

默认情况下,InnoDB包含在MySQL二进制发行版中。Windows Essentials安装程序使InnoDB成为Windows上MySQL的默认表。

InnoDB用于在许多需要高性能的大型数据库站点上生成。著名的互联网新闻网站Slashdot.org运行在InnoDB上。Mytrix,Inc .在InnoDB上存储了超过1TB的数据,其他一些网站在InnoDB上平均每秒处理800次插入/更新。