44

MySql 中的 MyISAM 和 Inno DB 类型有什么区别?

4

12 回答 12

58

主要区别在于 InnoDB 支持事务,而 MyISAM 不支持。

还有许多其他差异,但我知道的常见差异是:

  • MyISAM 通常被认为在搜索方面更快,但最近的 InnoDB 改进正在消除这种差异并提高高并发工作负载性能
  • InnoDB 支持事务,而 MyISAM 不支持
  • InnoDB 支持引用完整性,而 MyISAM 不支持
  • InnoDB 处理索引有点不同,将主键存储为每个索引的一部分(使索引在磁盘上占用更多空间,但也使覆盖索引更有可能)
  • MyISAM 进行表级锁定,而 InnoDB 可以进行行级锁定
  • MySQL 配置文件中使用了不同的内存/缓冲区/索引设置
  • InnoDB 通常被认为具有更好的崩溃恢复
  • 正如另一个答案中提到的,数据以不同的方式存储在磁盘上。我相信 InnoDB 在这方面是可配置的,如果需要,每个表可以有一个文件等

我敢肯定,谷歌搜索或 MySQL 网站会更详细地提出许多其他差异。

于 2008-11-10T09:45:20.710 回答
19

InnoDB 和 MyISAM

特点和性能比较:

  1. InnoDB 较新,而 MyISAM 较旧。
  2. InnoDB 更复杂,而 MyISAM 更简单。
  3. InnoDB 在数据完整性方面更加严格,而 MyISAM 是松散的。
  4. InnoDB 实现了用于插入和更新的行级锁,而 MyISAM 实现了表级锁。
  5. InnoDB 有事务,而 MyISAM 没有。
  6. InnoDB 有外键和关系约束,而 MyISAM 没有。
  7. InnoDB 有更好的崩溃恢复,而 MyISAM 在系统崩溃时恢复数据完整性方面很差。
  8. MyISAM 有全文搜索索引,而 InnoDB 没有。

鉴于这些差异,InnoDB 和 MyISAM 各有其独特的优势和劣势。它们在某些情况下都比另一个更适合。

InnoDB 的优势

  1. InnoDB 应该用于优先考虑数据完整性的地方,因为它在关系约束和事务的帮助下固有地处理它们。
  2. 在写入密集型(插入、更新)表中更快,因为它利用行级锁定并且只保留对正在插入或更新的同一行的更改。

InnoDB 的缺点

  1. 由于 InnoDB 必须处理表之间的不同关系,数据库管理员和方案创建者必须花费更多时间来设计比 MyISAM 更复杂的数据模型。
  2. 消耗更多的系统资源,例如 RAM。事实上,许多人建议在安装 MySQL 后如果没有实质性的需要,关闭 InnoDB 引擎。
  3. 没有全文索引。

MyISAM 的优势

  1. 设计和创建更简单,因此更适合初学者。不用担心表之间的外部关系。
  2. 由于结构更简单,因此总体上比 InnoDB 更快,因此服务器资源的成本要低得多。
  3. 全文索引。
  4. 特别适用于读取密集型(选择)表。

MyISAM 的缺点

  1. 没有数据完整性(例如关系约束)检查,这是数据库管理员和应用程序开发人员的责任和开销。
  2. 不支持在银行等关键数据应用程序中必不可少的交易。
  3. 对于频繁插入或更新的表,比 InnoDB 慢,因为整个表都被锁定以进行任何插入或更新。

比较非常简单。InnoDB 更适合需要频繁插入和更新的数据危急情况。另一方面,MyISAM 在不太依赖于数据完整性并且大多只是选择和显示数据的应用程序中表现更好。

参考: InnoDB 和 MyISAM 的比较

您还可以在此处查看更多详细信息: MyISAM 或 InnoDB MySQL 引擎?

希望这可以帮助。

于 2011-10-15T05:35:44.110 回答
16

MyISAM 支持(非标准 SQL)全文索引,而 InnoDB 仍然不支持。这是我们今天使用 MyISAM 的唯一原因。

于 2008-11-10T10:53:05.630 回答
4

MyISAM 和 InnoDB 最重要的区别在于 InnoDB 支持事务和外键。如果您需要外键和相关功能(例如自动级联删除),则需要使用 InnoDB。

在大多数情况下,InnoDB 比 MyISAM 慢,但由于更好的锁定机制,在某些条件下可以执行得更快;MyISAM 在执行插入/更新时锁定整个表以供读取。InnoDB 可以进行行级锁定,从而允许对表进行多个并发写入和读取。

于 2008-11-10T10:14:13.337 回答
3

您可以在 MySQL 文档中获得有关 MyISAM 和 InnoDB 的更多信息:

http://dev.mysql.com/doc/refman/5.1/en/myisam-storage-engine.html

http://dev.mysql.com/doc/refman/5.1/en/innodb-overview.html

于 2008-11-10T11:58:52.160 回答
1

主要区别在于 InnoDB 支持transactions,而 MyISAM 不支持。

于 2008-11-10T09:45:20.493 回答
1

MyISAM 和 InnoDB 也以不同的方式将数据存储在磁盘上。MyISAM 为每个表使用一个数据文件和一个索引文件,存储在以数据库命名的目录中。InnoDB 似乎将所有内容集中在一个名为 ibdata1 的文件中。

于 2008-11-10T09:48:22.000 回答
1

NFS 支持

与 MyISAM 不同,InnoDB 在 NFS 上可能存在问题。

配置 InnoDB (MySQL 5.5 版)

警告

如果您的数据考虑可靠性,请不要将 InnoDB 配置为使用 NFS 卷上的数据文件或日志文件。潜在问题因操作系统和 NFS 版本而异,包括缺乏对冲突写入的保护以及对最大文件大小的限制等问题。

于 2010-10-14T19:16:24.043 回答
1

InnoDB 特点 1. 提供完整的事务能力和完整的 ACID(原子性、一致性、隔离性和持久性)合规性。

  1. 它具有行级锁定。通过支持行级锁定,您可以将数据添加到 InnoDB 表,而无需引擎在每次插入时锁定表,这加快了数据库中信息的恢复和存储。

  2. InnoDB 系统的关键是数据库、缓存和索引结构,其中索引和数据都缓存在内存中以及存储在磁盘上。这可以实现非常快速的恢复,甚至可以在非常大的数据集上工作。

  3. InnoDB 支持外键约束

  4. InnoDB 支持自动崩溃恢复
  5. InnoDB 支持表压缩(读/写)
  6. InnoDB 支持空间数据类型(无空间索引)

  7. Innodb 支持非锁定 ANALYZE TABLE 并且仅在服务器运行时间较长时才需要,因为它会在表打开时深入索引统计并获取索引信息。

  8. Innodb 没有单独的索引文件,因此不必打开它们。

  9. Innodb 按主键顺序(在 ALTER 之后)一次构建其索引,这意味着索引树不是按最佳顺序构建的并且是碎片化的。目前无法对 InnoDB 索引进行碎片整理,因为 InnoDB 无法构建在 MySQL 5.0 中通过排序索引。即使删除和重新创建 InnoDB 索引也可能会导致索引碎片化,具体取决于数据。

  10. 一个表最多可以包含 1000 列。

  11. InnoDB 内部最大密钥长度为 3500 字节,但 MySQL 本身将其限制为 3072 字节。(MySQL 5.0.17 之前的非 64 位构建以及 5.0.15 之前的所有构建为 1024 字节。)

  12. InnoDB 中的默认数据库页面大小为 16KB。通过重新编译代码,您可以将其设置为 8KB 到 64KB 范围内的值。您必须在 univ.i 源文件中更新 UNIV_PAGE_SIZE 和 UNIV_PAGE_SIZE_SHIFT 的值。
  13. InnoDB 表不支持 FULLTEXT 索引。

    MYISAM 特点

    1. 无交易支持
    2. 表级锁定
    3. 提供全文搜索
    4. 表中数据没有限制。
    5. 快速 COUNT(*)s(不使用 WHERE、GROUP BY 或 JOIN 时)
    6. 全文索引
    7. 更小的磁盘占用
    8. 非常高的表压缩(只读)
    9. 空间数据类型和索引(R-tree)
  14. 通过使用 DATA DIRECTORY='/path/to/data/directory' 或 INDEX DIRECTORY='/path/to/index/directory' 您可以指定 MyISAM 存储引擎应该将表的数据文件和索引文件放在哪里。目录必须是目录的完整路径名,而不是相对路径。

您可以在http://faisalbhagat.blogspot.com/2014/09/innodb-vs-myisam.html找到更多详细信息

于 2014-09-10T14:42:53.063 回答
0

以下是 InnoDB 和 MyIsam 之间差异的描述:

InnoDB 和 MyIsam 的区别

几个区别:

  • MISAM不支持任何数据库事务,
  • INNODB将提供交易
  • MISAM提供表级锁定,
  • INNODB提供行级锁定
  • INNOBD支持外键,MYISAM不...
于 2008-11-10T12:55:27.457 回答
0

MyISAM 在备份方面更方便,因为锁定所有表并直接在文件系统中复制文件相当简单。(作为 perl 脚本的 mysqlhotcopy 甚至是 mysql afaik 的一部分)

InnoDB 稍微复杂一些,仅仅复制文件是行不通的,因为它们无法在另一台机器上开箱即用地恢复。

但是,也有提供 InnoDB hotcopying 的商业软件。

于 2008-11-10T13:12:56.503 回答
0

虽然事务支持是主要区别,但如果您将长时间运行的 SELECT 查询与 UPDATE 语句混合使用,则表级锁定可能会成为问题。

于 2009-10-13T16:26:33.860 回答