什么是 MySQL 中的 InnoDB 和 MyISAM?

MySQL中的 InnoDBMyISAM是什么?

97397 次浏览

它们是存储引擎。

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 还支持 FOREIGNKEY 引用完整性约束。

看看这个

InnoDB 和 < a href = “ http://en.wikipedia.org/wiki/MyISAM”rel = “ norefrer”> MyISAM

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

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

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

也就是说,InnoDB 一直在进步:

InnoDB 1.1性能和可伸缩性增强

InnoDBMYISAMMySQL的存储引擎。

这两种锁定实现不同: InnoDB锁定表中的特定行,而 MyISAM锁定整个 MySQL表。

在 DB 中创建表时,可以通过给出 MYISAMInnoDB来指定类型。

MyISAM 不遵循 ACID,而 InnoDB 遵循事务以保持数据的完整性。

MyISAM 支持并发插入: 如果表在 在数据文件的中间,可以在 与此同时,其他线程正在从表中读取数据。 < a href = “ https://dev.mysql.com/doc/refman/5.7/en/myisam-Storage-engine.html”rel = “ nofollow norefrer”> MySqlDoc

这就是为什么,MyISAM 更快,占用更少的空间。例如,MySQL MyISAM 存储引擎不支持事务处理。 约束有一个比特名为 < a href = “ https://dev.MySQL.com/doc/refman/5.6/en/server-system-variables.html # sysvar _ 征发 _ insert”rel = “ nofollow norefrer”> 并发插入 默认情况下,变量设置为1,并发插入的处理方式如上所述。如果设置为0,则禁用并发插入。如果设置为2,即使对于已删除行的表,也允许在表的末尾进行并发插入。如果表的中间没有空洞/删除的行(在并发插入时) ,可以执行 INSERT 语句以同时使用 select 将行添加到表的末尾。

默认的隔离级别 og mysql InnoDB 是“ ReadRepateable”。对于 MyISAM,没有事务。InnoDB 使用行级锁定,而 MyISAM 只能使用表级锁定,这就是为什么 InnoDB 的崩溃恢复比 MyISAM 好。如果想要避免并发效应,就必须在 MyISAM 中使用 手动获取表级锁

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

当 MySQL 服务器崩溃时,从一组 MyISAM 表中恢复数据要比从大型 InnoDB 事务文件中恢复数据容易得多。每个 MyISAM 表都有一个单独的文件,如果在崩溃期间没有对该表执行写操作,那么它将完全不受影响。对于 InnoDB,整个 MySQL 服务器的整个事务文件必须重新建立索引,或者在崩溃后重新建立索引。那会很麻烦的。

InnoDB 是 MySQL 的事务性存储引擎,而 MyISAM是非事务性存储引擎。换句话说,InnoDB 遵循 ACID 属性来维护数据的完整性,但 MyISAM 不遵循 ACID 属性,因此无法维护数据的完整性。

在 InnoDB (事务性)表中,事务性更改可以是 如果需要回滚,很容易撤销 (非事务性)表在回滚 交易是必须的。

例如,你想把钱从你的支票账户转到储蓄账户。这是由一个包含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步崩溃,钱将从您的支票帐户中扣除。但是钱不会被添加到你的储蓄帐户。

示例礼貌: “ High Performance MySQL: Optimation,Backups,and Replication”- 作者: Arjen Lentz,Derek J. Balling,Jeremy Zawodny,Peter Zaitsev,和 Vadim Tkachenko