【问题标题】:What is InnoDB and MyISAM in MySQL?MySQL 中的 InnoDB 和 MyISAM 是什么?
【发布时间】:2011-04-18 15:21:19
【问题描述】:

MySQL 中的 InnoDBMyISAM 是什么?

【问题讨论】:

标签: mysql innodb myisam


【解决方案1】:

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 编写

【讨论】:

  • 很好地解决了我的疑问。非常感谢!!
  • @Ganesh Patil 很高兴为您提供帮助
【解决方案2】:

当您的 MySQL 服务器崩溃时,从一组 MyISAM 表中恢复数据比从那个大的 InnoDB 事务文件中恢复要容易得多。每个 MyISAM 表都有一个单独的文件,如果在崩溃期间没有对该表进行写操作 - 它将完全不受影响。在 InnoDB 的情况下,整个 MySQL 服务器的整个事务文件必须重新索引或在崩溃后执行任何操作。这可能会变得非常混乱。

【讨论】:

    【解决方案3】:

    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 中手动获取表级锁

    【讨论】:

      【解决方案4】:

      InnoDBMYISAMMySQL 的存储引擎。

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

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

      【讨论】:

      • 清晰而简单的答案。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我想补充一点,能够为每个表指定特定的存储引擎是 MySQL 的主要优势之一(除了易于使用和无需调整的良好性能之外)。对于所有需要事务的操作,只要坚持使用 InnoDB。然而,当在某些情况下不需要事务时,MyISAM 确实可以加快处理速度——并且与 InnoDB 相比,它需要更少的磁盘空间和 RAM。

        也就是说,InnoDB 一直在变得更好:

        InnoDB 1.1 Performance and Scalability Enhancements

        【讨论】:

          【解决方案7】:

          看看

          InnoDBMyISAM

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

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

          【讨论】:

          • 我们可以同时为我们的数据库使用两个存储引擎吗?
          • 可以,因为您可以为每个表定义不同的存储引擎。另一个问题是你是否应该这样做。在 mysql 文档中有一些关于这个主题的解释。
          【解决方案8】:

          它们是存储引擎。

          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 时,我们是否需要明确指定使用哪个存储引擎作为我们的 MySQL 数据库?
          • 正如我的帖子中提到的,默认是 MyISAM。如果您想使用其他存储引擎(例如 INNODB)的功能,那么您需要指定。这不是在安装期间完成的,而是在初始表创建期间完成的。
          • 但是按照这个:- dev.mysql.com/doc/refman/5.7/en/storage-engines.html;默认引擎是 InnoDB。
          • 根据dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html:“从 MySQL 5.5.5 开始,默认引擎是 InnoDB(MyISAM 在 5.5.5 之前)”所以默认引擎现在是 InnoDB。这个答案是在第一个以 InnoDB 作为默认引擎的通用版本发布 16 天后发布的;)
          猜你喜欢
          • 2012-03-01
          • 1970-01-01
          • 2011-05-14
          • 2011-12-20
          • 2012-01-13
          • 2010-11-16
          • 2011-09-17
          • 2016-10-06
          • 2012-04-14
          相关资源
          最近更新 更多