什么是InnoDB
和MyISAM
在MySQL
?
什么是InnoDB
和MyISAM
在MySQL
?
Answers:
InnoDB
和MYISAM
是用于的存储引擎MySQL
。
两者在锁定实现上有所不同:InnoDB
锁定表中的特定行,并MyISAM
锁定整个MySQL
表。
您可以在数据库中创建表时通过给出MYISAM
OR 来指定类型InnoDB
。
看一下
InnoDB是MySQL的存储引擎,已作为标准包含在MySQL AB分发的所有当前二进制文件中。与可用于MySQL的其他存储引擎相比,它的主要增强是符合ACID的事务支持
MyISAM是5.5 1之前的MySQL关系数据库管理系统版本的默认存储引擎。它基于较早的ISAM代码,但具有许多有用的扩展。 MyISAM的主要缺陷是缺乏交易支持。 MySQL 5.5及更高版本已切换到InnoDB引擎,以确保引用完整性约束和更高的并发性。
它们是存储引擎。
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的主要优势之一(易于使用且性能良好,无需进行任何调整)。对于需要交易的所有操作,只需坚持使用InnoDB。但是,在某些情况下不需要事务时,MyISAM确实可以加快速度-与InnoDB相比,它需要更少的磁盘空间和RAM。
也就是说,InnoDB一直在变得更好:
MyISAM不遵循ACID,而InnoDB遵循事务以维护数据完整性。
MyISAM支持并发插入:如果表在数据文件的中间没有空闲块,则可以在其他线程从表读取数据的同时,向其中插入新行。MySqlDoc
这就是为什么MyISAM更快,占用空间更少的原因。例如,MySQL MyISAM存储引擎不支持事务处理。MySQL MYISAM的约束有一点称为并发插入 默认情况下,变量设置为1,并按上述方式处理并发插入。如果将其设置为0,则禁用并发插入。如果将其设置为2,则即使对于已删除行的表,也允许在表末尾进行并发插入。如果在表中间(并发插入时)没有孔/已删除的行,则可以执行INSERT语句以在选择的同时将行添加到表的末尾。
mysql InnoDB的默认隔离级别为“可重复读取”。对于MyISAM,没有任何交易。InnoDB使用行级锁定,而MyISAM只能使用表级锁定,这就是为什么InnoDB具有崩溃恢复能力比MyISAM更好的原因。如果要避免并发影响,则必须手动获取 MyISAM中的表级别锁。
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撰写的书
InnoDB是默认的NOT myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html “ InnoDB是默认的MySQL存储引擎。除非您配置了其他默认存储引擎,否则请发出没有ENGINE =子句的CREATE TABLE语句创建一个InnoDB表”