【发布时间】:2011-04-18 15:21:19
【问题描述】:
MySQL 中的 InnoDB 和 MyISAM 是什么?
【问题讨论】:
-
这是数据库引擎...kavoir.com/2009/09/…
-
我们可以同时为我们的数据库使用两个存储引擎吗?
-
您可以在不同的表上同时使用它们,但是对于给定的表,您需要选择要使用的表...
MySQL 中的 InnoDB 和 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 编写
【讨论】:
当您的 MySQL 服务器崩溃时,从一组 MyISAM 表中恢复数据比从那个大的 InnoDB 事务文件中恢复要容易得多。每个 MyISAM 表都有一个单独的文件,如果在崩溃期间没有对该表进行写操作 - 它将完全不受影响。在 InnoDB 的情况下,整个 MySQL 服务器的整个事务文件必须重新索引或在崩溃后执行任何操作。这可能会变得非常混乱。
【讨论】:
MyISAM 不遵循 ACID,而 InnoDB 遵循事务以保持数据的完整性。
MyISAM 支持并发插入:如果表中没有空闲块 在数据文件的中间,您可以在 同时其他线程正在从表中读取。 MySqlDoc
这就是为什么 MyISAM 速度更快且占用空间更少的原因。比如 MySQL MyISAM 存储引擎不支持事务。constraints of MySQL MYISAM 有一个位叫concurrent-insert 默认情况下,该变量设置为 1,并发插入的处理方式如前所述。如果设置为 0,则禁用并发插入。如果设置为 2,即使对于已删除行的表,也允许在表末尾进行并发插入。如果表中间没有空洞/删除的行(在并发插入时),则可以执行 INSERT 语句以将行添加到表的末尾。
mysql InnoDB 的默认隔离级别是“Read Repeatable”。对于 MyISAM,没有交易。 InnoDB 使用行级锁定,而 MyISAM 只能使用表级锁定,这就是 InnoDB 的崩溃恢复比 MyISAM 更好的原因。如果想要避免并发影响,则必须在 MyISAM 中手动获取表级锁。
【讨论】:
InnoDB 和MYISAM 是MySQL 的存储引擎。
这两者在锁定实现上有所不同:InnoDB 锁定表中的特定行,MyISAM 锁定整个 MySQL 表。
在 DB 中创建表时,您可以通过提供 MYISAM 或 InnoDB 来指定类型。
【讨论】:
InnoDB 是默认的 NOT myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDB 是默认的 MySQL 存储引擎。除非您配置了不同的默认存储引擎,否则发出不带 ENGINE= 子句的 CREATE TABLE 语句会创建 InnoDB 表"
【讨论】:
我想补充一点,能够为每个表指定特定的存储引擎是 MySQL 的主要优势之一(除了易于使用和无需调整的良好性能之外)。对于所有需要事务的操作,只要坚持使用 InnoDB。然而,当在某些情况下不需要事务时,MyISAM 确实可以加快处理速度——并且与 InnoDB 相比,它需要更少的磁盘空间和 RAM。
也就是说,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 引用完整性约束。
【讨论】: