什么是MySQL中的InnoDB和MyISAM?


121

什么是InnoDBMyISAMMySQL



这是数据库引擎... kavoir.com/2009/09/…–
Matthieu

我们可以同时为数据库使用两个存储引擎吗?
user130561

1
您可以在不同的表上同时使用它们,但是对于一个给定的表,您将需要选择要使用的表...
Matthieu 2010年

Answers:


110

InnoDBMYISAM是用于的存储引擎MySQL

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

您可以在数据库中创建表时通过给出MYISAMOR 来指定类型InnoDB


答案简单明了。
vadiraj jahagirdar

38

看一下

InnoDBMyISAM

InnoDB是MySQL的存储引擎,已作为标准包含在MySQL AB分发的所有当前二进制文件中。与可用于MySQL的其他存储引擎相比,它的主要增强是符合ACID的事务支持

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


1
我们可以同时为数据库使用两个存储引擎吗?
user130561

2
您可以,因为您可以为每个表定义不同的存储引擎。另一个问题是您是否应该这样做。mysql文档中有关于此主题的一些说明。
nano7 2011年

18

它们是存储引擎。

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

MyISAM:默认的MySQL存储引擎,在Web,数据仓库和其他应用程序环境中使用最多的一种。MyISAM在所有MySQL配置中均受支持,并且是默认的存储引擎,除非您已将MySQL配置为默认使用其他配置。

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


因此,在安装MySQL时,是否需要特别指定要用作MySQL数据库的存储引擎?
user130561

3
如我的帖子所述,默认值为MyISAM。如果要使用其他存储引擎(如INNODB)的功能,则需要指定。这不是在安装过程中完成的,而是在初始表创建过程中完成的。
mluebke 2010年

3
但是按照这个:-dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; 默认引擎是InnoDB。
哈莎

2
根据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

6

我想补充一点,能够为每个表指定特定的存储引擎是MySQL的主要优势之一(易于使用且性能良好,无需进行任何调整)。对于需要交易的所有操作,只需坚持使用InnoDB。但是,在某些情况下不需要事务时,MyISAM确实可以加快速度-与InnoDB相比,它需要更少的磁盘空间和RAM。

也就是说,InnoDB一直在变得更好:

InnoDB 1.1性能和可伸缩性增强


4

MyISAM不遵循ACID,而InnoDB遵循事务以维护数据完整性。

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

这就是为什么MyISAM更快,占用空间更少的原因。例如,MySQL MyISAM存储引擎不支持事务处理。MySQL MYISAM的约束有一点称为并发插入 默认情况下,变量设置为1,并按上述方式处理并发插入。如果将其设置为0,则禁用并发插入。如果将其设置为2,则即使对于已删除行的表,也允许在表末尾进行并发插入。如果在表中间(并发插入时)没有孔/已删除的行,则可以执行INSERT语句以在选择的同时将行添加到表的末尾。

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


3

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撰写的书


1

当您的MySQL服务器崩溃时,从MyISAM表集中恢复数据要比从大型InnoDB事务文件恢复数据容易得多。每个MyISAM表都有一个单独的文件,并且如果在崩溃期间未对该表进行任何写操作,它将完全不受影响。如果是InnoDB,则必须重新索引整个MySQL服务器的整个事务文件,或者在崩溃后执行任何操作。那会变得很混乱。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.