InnoDB
和 MyISAM
在 MySQL
中是什么?
InnoDB
和 MyISAM
在 MySQL
中是什么?
InnoDB
和MYISAM
是用于MySQL
的存储引擎。
这两者在它们的锁定实现上有所不同:InnoDB
锁定表中特定行,而MyISAM
锁定整个MySQL
表。
您可以在创建数据库中的表时通过指定MYISAM
或InnoDB
来指定类型。
它们是存储引擎。
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。
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;
与InnoDB相反,MyISAM不遵循ACID,而是使用并发插入来维护数据的完整性。
MyISAM支持并发插入:如果表中没有空闲块,则可以在其他线程从表中读取时同时向其中插入新行。 MySqlDoc
这就是为什么MyISAM更快且占用更少空间的原因。例如,MySQL MyISAM存储引擎不支持事务。MySQL MYISAM的约束条件有一个叫做concurrent-insert的比特。默认情况下,该变量设置为1,并且并发插入会像刚才描述的那样处理。如果将其设置为0,则禁用并发插入。如果将其设置为2,则即使对于已删除行的表,也允许在表的末尾进行并发插入。如果在表中间没有空洞/删除行(在并发插入时),可以执行INSERT语句将行添加到表的末尾。
MySQL InnoDB的默认隔离级别是“可重复读”。对于MyISAM,没有事务。InnoDB使用行级锁定,而MyISAM只能使用表级锁定,这就是为什么InnoDB具有更好的崩溃恢复性能比MyISAM好的原因。如果要避免并发效应,则必须在MyISAM中手动获取表级锁。
InnoDB是默认的MySQL存储引擎,而不是MyISAM。 https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "除非您配置了其他默认存储引擎,否则发出没有ENGINE=子句的CREATE TABLE语句会创建一个InnoDB表。"