InnoDB
中的MyISAM
和MySQL
是什么?
答案 0 :(得分:92)
InnoDB
和MYISAM
是MySQL
的存储引擎。
这两个锁定实现不同:InnoDB
锁定表中的特定行,MyISAM
锁定整个MySQL
表。
您可以在DB中创建表格时通过提供MYISAM
或InnoDB
来指定类型。
答案 1 :(得分:36)
看看
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一直在变得越来越好:
答案 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组成。