什么是MySQL中的InnoDB和MyISAM?

时间:2010-09-29 04:36:39

标签: mysql innodb myisam

InnoDB中的MyISAMMySQL是什么?

8 个答案:

答案 0 :(得分:92)

InnoDBMYISAMMySQL的存储引擎。

这两个锁定实现不同:InnoDB锁定表中的特定行,MyISAM锁定整个MySQL表。

您可以在DB中创建表格时通过提供MYISAMInnoDB来指定类型。

答案 1 :(得分:36)

看看

InnoDBMyISAM

  

InnoDB是MySQL的存储引擎,   包含在所有当前的标准   MySQL AB分发的二进制文件。它的   主要增强其他存储   可用于MySQL的引擎   是符合ACID标准的交易支持

     

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

答案 2 :(得分:17)

它们是存储引擎。

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参照完整性约束。

答案 3 :(得分:5)

我想补充说,能够为每个表指定一个特定的存储引擎是MySQL的关键优势之一(除了易于使用和良好的性能,没有调整)。对于需要交易的所有操作,只需坚持使用InnoDB即可。但是,在某些情况下不需要事务时,MyISAM可以真正加快速度 - 与InnoDB相比,需要更少的磁盘空间和RAM。

尽管如此,InnoDB一直在变得越来越好:

InnoDB 1.1 Performance and Scalability Enhancements

答案 4 :(得分:4)

MyISAM不遵循ACID而不是InnoDB,后者遵循事务来维护数据的完整性。

  

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

这就是为什么,MyISAM速度更快,占用空间更少。例如,MySQL MyISAM存储引擎不支持转移。constraints of MySQL MYISAM有一点叫concurrent-insert 默认情况下,该变量设置为1,并且如前所述处理并发插入。如果设置为0,则禁用并发插入。如果设置为2,则即使对于已删除行的表,也允许在表末尾进行并发插入。如果表中间没有漏洞/删除的行(在并发插入时),则可以执行INSERT语句以在表的末尾添加行,同时选择select。

默认隔离级别og mysql InnoDB是" Read Repeatable"。对于MyISAM,没有交易。 InnoDB使用行级锁定,而MyISAM只能使用表级锁定,这就是为什么InnoDB崩溃重建比MyISAM更好。如果想要避免并发效应,则必须在MyISAM中手动获取表级锁

答案 5 :(得分:1)

InnoDB是默认的NOT myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html “InnoDB是默认的MySQL存储引擎。除非您配置了不同的默认存​​储引擎,否则发出不带ENGINE =子句的CREATE TABLE语句会创建一个InnoDB表”

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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组成。