MySQL中的InnoDB和MyISAM是什么?

134

InnoDBMyISAMMySQL 中是什么?


8
重复的问题:MySql:MyISAM vs. Inno DB!,或者您可以选择:http://stackoverflow.com/search?q=myisam+vs+innodb - OMG Ponies
这是数据库引擎... http://www.kavoir.com/2009/09/mysql-engines-innodb-vs-myisam-a-comparison-of-pros-and-cons.html - Matthieu
我们可以同时在数据库中使用两种存储引擎吗? - user130561
1
你可以同时在不同的表上使用它们,但对于一个给定的表,你需要选择想要使用哪个... - Matthieu
8个回答

129

InnoDBMYISAM是用于MySQL的存储引擎。

这两者在它们的锁定实现上有所不同:InnoDB锁定表中特定行,而MyISAM锁定整个MySQL表。

您可以在创建数据库中的表时通过指定MYISAMInnoDB来指定类型。


清晰简洁的回答。 - Vadiraj S J

38

请看

InnoDBMyISAM

InnoDB是MySQL的一种存储引擎,被包含在MySQL AB分发的所有二进制文件中。与其他可用于MySQL的存储引擎相比,其主要优点是支持ACID事务。

MyISAM是MySQL关系数据库管理系统版本5.5之前的默认存储引擎1。它基于旧版ISAM代码,但具有许多有用的扩展。MyISAM的主要缺陷是不支持事务处理。 MySQL 5.5及更高版本已切换到InnoDB引擎以确保引用完整性约束和更高并发性。


1
我们可以同时在数据库中使用两种存储引擎吗? - user130561
2
你可以这样做,因为对于每个表,你都可以定义不同的存储引擎。另一个问题是你是否应该这样做。在MySQL文档中有一些关于这个主题的解释。 - nano7

18

它们是存储引擎。

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

MyISAM: 默认的MySQL存储引擎,也是Web、数据仓库和其他应用环境中使用最广泛的存储引擎。MyISAM在所有MySQL配置中都受支持,并且除非您已将MySQL默认配置为使用其他存储引擎,否则它是默认的存储引擎。

InnoDB: 一种事务安全(符合ACID标准)的MySQL存储引擎,具有提交、回滚和崩溃恢复功能以保护用户数据。InnoDB采用行级锁定(无需升级到更粗粒度的锁)和Oracle风格的一致性非锁定读取,可提高多用户并发性能。为了维护数据完整性,InnoDB还支持FOREIGN KEY参照完整性约束,并通过聚集索引存储用户数据,以减少基于主键的常见查询的I/O。


在安装MySQL时,我们需要明确指定要使用哪个存储引擎作为我们的MySQL数据库吗? - user130561
3
如我在帖子中所提到的,默认存储引擎是 MyISAM。如果您想使用其他存储引擎的功能,例如 INNODB,则需要指定它。这不是在安装过程中完成的,而是在初始表创建期间完成的。 - mluebke
3
根据这个链接:http://dev.mysql.com/doc/refman/5.7/en/storage-engines.html;默认的数据库引擎是InnoDB。 - Harsha
2
根据https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html的说法:“自MySQL 5.5.5起,默认引擎为InnoDB(在5.5.5之前为MyISAM)”。因此,现在默认引擎是InnoDB。这个答案是在首个使用InnoDB作为默认引擎的正式发布后16天发布的 ;) - SOFe

10

InnoDB是MySQL的一种事务性存储引擎,而MyISAM是一种非事务性存储引擎。换句话说,InnoDB遵循ACID属性以维护数据的完整性,但MyISAM不遵循ACID属性,因此无法维护数据的完整性。

在InnoDB(事务性)表中,如果需要回滚,则可以轻松撤消事务性更改。但是,在MyISAM(非事务性)表中进行的更改在需要回滚事务时无法撤消。

例如,您想将资金从支票账户转移到储蓄账户。这是通过包括5个查询的事务完成的。

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

假设,在第4步时发生了进程崩溃。如果使用InnoDB表,则回滚将撤消更改,并使您免于损失金钱的风险。从字面上看,表不知道任何崩溃,因为除非成功执行第5步,否则更改不会提交到表中。
但是,在使用MyISAM表的情况下,当调用回滚或事务失败导致崩溃时,无法撤消事务性更改。这意味着,如果事务在第3步崩溃,则会从您的支票帐户中扣减资金。但不会将资金添加到您的储蓄账户中。 示例来自:《高性能MySQL: 优化、备份和复制》- Arjen Lentz, Derek J. Balling, Jeremy Zawodny, Peter Zaitsev和Vadim Tkachenko所著的书籍

2
非常清楚地解决了我的疑惑。非常感谢!! - Ganesh Patil
@Ganesh Patil 很高兴能帮忙。 - Steffi Keran Rani J

6
我想补充一点,MySQL 能够针对每个表指定特定的存储引擎是 MySQL 的关键优势之一(除了易于使用和良好的性能外,无需调整)。在所有需要事务的操作中,只需使用 InnoDB。然而,在某些情况下,当不需要事务时,MyISAM 真的可以加快速度,并且相比 InnoDB 需要更少的磁盘空间和 RAM。
话虽如此,InnoDB 的性能也在不断提高: InnoDB 1.1 性能和可扩展性增强

4

与InnoDB相反,MyISAM不遵循ACID,而是使用并发插入来维护数据的完整性。

MyISAM支持并发插入:如果表中没有空闲块,则可以在其他线程从表中读取时同时向其中插入新行。 MySqlDoc

这就是为什么MyISAM更快且占用更少空间的原因。例如,MySQL MyISAM存储引擎不支持事务。MySQL MYISAM的约束条件有一个叫做concurrent-insert的比特。默认情况下,该变量设置为1,并且并发插入会像刚才描述的那样处理。如果将其设置为0,则禁用并发插入。如果将其设置为2,则即使对于已删除行的表,也允许在表的末尾进行并发插入。如果在表中间没有空洞/删除行(在并发插入时),可以执行INSERT语句将行添加到表的末尾。

MySQL InnoDB的默认隔离级别是“可重复读”。对于MyISAM,没有事务。InnoDB使用行级锁定,而MyISAM只能使用表级锁定,这就是为什么InnoDB具有更好的崩溃恢复性能比MyISAM好的原因。如果要避免并发效应,则必须在MyISAM中手动获取表级锁


1
当你的MySQL服务器崩溃时,从一组MyISAM表中恢复数据比从那个大的InnoDB事务文件中恢复要容易得多。每个MyISAM表都有一个单独的文件,如果在崩溃期间没有对该表进行写操作,则它将完全不受影响。在InnoDB的情况下,必须重新索引或进行其他操作以恢复整个MySQL服务器的整个事务文件。这可能会变得非常混乱。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接