InnoDB 和 MyISAM 之间的主要区别是什么?

ilh*_*han 263 mysql innodb myisam

InnoDB 和 MyISAM 之间的主要区别是什么?

poe*_*nca 176

我看到的第一个主要区别是 InnoDB 实现了行级锁,而 MyISAM 只能执行表级锁。你会在 InnoDB 中找到更好的崩溃恢复。但是,它在FULLTEXTv5.6 之前没有搜索索引,MyISAM 也是如此。InnoDB 还实现了事务、外键和关系约束,而 MyISAM 没有。

该列表可以更进一步。然而,他们都有自己独特的优势,对彼此有利,也有不利。在某些情况下,它们中的每一个都比其他更适合。

总结一下(TL;DR):

  • InnoDB 有行级锁,MyISAM 只能做全表级锁。
  • InnoDB 有更好的崩溃恢复。
  • MyISAM 有FULLTEXT搜索索引,InnoDB 直到 MySQL 5.6(2013 年 2 月)才有。
  • InnoDB 实现了事务、外键和关系约束,而 MyISAM 没有。


Rol*_*DBA 96

另一个尚未提及的主要区别是每个存储引擎的缓存是如何完成的。

马来西亚

使用的主要机制是密钥缓存。它只缓存 .MYI 文件中的索引页。要调整密钥缓存的大小,请运行以下查询:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;
Run Code Online (Sandbox Code Playgroud)

这将给出 MyISAM 密钥缓存的推荐设置 ( key_buffer_size ) 给定您当前的数据集(查询将推荐上限为 4G (4096M)。对于 32 位操作系统,4GB 是限制。对于 64 位,8GB。

数据库

使用的主要机制是 InnoDB 缓冲池。它从访问的 InnoDB 表中缓存数据和索引页。要调整 InnoDB 缓冲池的大小,请运行以下查询:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
Run Code Online (Sandbox Code Playgroud)

这将给出 InnoDB 缓冲池 ( innodb_buffer_pool_size )大小的推荐设置,给定您当前的数据集。

不要忘记调整 InnoDB 日志文件(ib_logfile0 和 ib_logfile1)的大小。MySQL 源代码规定所有 InnoDB 日志文件的总大小上限必须小于 4G (4096M)。为简单起见,仅给出两个日志文件,您可以通过以下方式调整它们的大小:

  • 步骤1)在/etc/my.cnf中加入innodb_log_file_size=NNN(NNN应为innodb_buffer_pool_size的25%或2047M,取较小者)
  • 第2步) service mysql stop
  • 步骤 3) rm /var/log/mysql/ib_logfile[01]
  • 步骤 4)service mysql start(重新创建 ib_logfile0 和 ib_logfile1)

警告

在两个查询的末尾是一个内联查询 (SELECT 2 PowerOf1024)B

  • (SELECT 0 PowerOf1024) 以字节为单位给出设置
  • (SELECT 1 PowerOf1024) 以千字节为单位给出设置
  • (SELECT 2 PowerOf1024) 以兆字节为单位给出设置
  • (SELECT 3 PowerOf1024) 给出以千兆字节为单位的设置
  • 不接受小于 0 或大于 3 的幂

结语

没有什么可以替代常识。如果您的内存有限、混合了存储引擎或它们的组合,则必须针对不同的场景进行调整。

  • 如果您有 2GB RAM 和 16GB InnoDB,则分配 512M 作为 innodb_buffer_pool。
  • 如果您有 2GB RAM 和 4GB 的 MyISAM 索引,则分配 512M 作为 key_buffer_size。
  • 如果您有 2GB RAM 和 4GB MyISAM 索引和 16GB InnoDB,则分配 512M 作为 key_buffer_size 和 512M 作为 innodb_buffer_pool_size。

可能的场景是无穷无尽的!!!

请记住,无论您分配什么,都要为数据库连接和操作系统留出足够的 RAM。

  • @Rick:2 的幂旨在以不同的单位显示答案。Doing (SELECT 2 PowerOfTwo) 以 MB 为单位设置答案的显示。Doing (SELECT 3 PowerOfTwo) 以 GB 为单位设置显示。(SELECT 1 PowerOfTwo) 以 KB 为单位显示。(SELECT 0 PowerOfTwo) 以字节显示。这就是 (SELECT 2 PowerOfTwo) 所做的。所以只需要显示,而不是在架构中强加任何假设值。 (3认同)
  • @Rick:你知道吗?我实际上会给你一个 +1 的两个非常重要的原因。1) 您的 URL 确认我的回答是正确的,因为 4GB 是分配给 key_buffer_size 的最大数字。2)您的答案以及您的网址对于内存非常低的机器来说是有意义的。我会在信用到期时给予信用。 (3认同)

dab*_*st1 66

InnoDB 提供:

  • ACID 事务
  • 行级锁
  • 外键约束
  • 自动崩溃恢复
  • 表压缩(读/写)
  • 空间数据类型(无空间索引)

在 InnoDB 中,一行中除 TEXT 和 BLOB 之外的所有数据最多可占用 8,000 字节。在 MySQL 5.6(2013 年 2 月)之前,InnoDB 中不提供全文索引。在 InnoDB 中,COUNT(*)s (当WHEREGROUP BYJOIN未使用时)执行速度比 MyISAM 慢,因为行计数不在内部存储。InnoDB 将数据和索引存储在一个文件中。InnoDB 使用缓冲池来缓存数据和索引。

MyISAM 提供:

  • fast COUNT(*)s(当WHEREGROUP BY、 或JOIN未使用时)
  • 全文索引(更新:在 MySQL 5.6 的 InnoDB 中支持)
  • 更小的磁盘空间
  • 非常高的表压缩(只读)
  • 空间数据类型和索引(R-tree)(更新:在 MySQL 5.7 的 InnoDB 中支持)

MyISAM 有表级锁,但没有行级锁。没有交易。没有自动崩溃恢复,但它确实提供了修复表功能。没有外键约束。与 InnoDB 表相比,MyISAM 表通常在磁盘上的大小更紧凑。如果需要,可以通过使用 myisampack 进行压缩,进一步大大减小 MyISAM 表的大小,但变为只读。MyISAM 将索引存储在一个文件中,将数据存储在另一个文件中。MyISAM 使用关键缓冲区来缓存索引,并将数据缓存管理留给操作系统。

总的来说,我会推荐 InnoDB 用于大多数用途,而 MyISAM 仅用于特殊用途。InnoDB 现在是新 MySQL 版本中的默认引擎。

  • 我阅读了您的答案,并将其与此处已有的其他答案进行了比较。你是唯一一个提到 BLOB 的人。他们通常被认为是理所当然的。你也是唯一一个提到 myisampack 的人,myisampack 是快速可读的 MyISAM 表的无名英雄之一。你今天是+1 !!! (5认同)
  • 示例是一个压缩的只读表,您可以通过完全替换该表对其进行不频繁的更新。 (2认同)

d4n*_*yll 38

游戏有点晚了……但这是我几个月前写的一篇非常全面的文章,详细介绍了 MYISAM 和 InnoDB 之间的主要区别。拿一杯咖啡(也许还有饼干),享受吧。


MyISAM 和 InnoDB 之间的主要区别在于参照完整性和事务。还有其他区别,例如锁定、回滚和全文搜索。

参照完整性

参照完整性确保表之间的关系保持一致。更具体地说,这意味着当一个表(例如 Listings)有一个指向不同表(例如 Products)的外键(例如 Product ID)时,当指向的表发生更新或删除时,这些更改将级联到链接桌子。在我们的例子中,如果一个产品被重命名,链接表的外键也将更新;如果产品从“产品”表中删除,则指向已删除条目的任何列表也将被删除。此外,任何新列表都必须具有指向有效的现有条目的外键。

InnoDB 是关系型 DBMS (RDBMS),因此具有参照完整性,而 MyISAM 则没有。

事务和原子性

表中的数据使用数据操作语言 (DML) 语句进行管理,例如 SELECT、INSERT、UPDATE 和 DELETE。事务将两个或多个 DML 语句组合到一个工作单元中,因此要么应用整个单元,要么不应用任何一个单元。

MyISAM 不支持事务,而 InnoDB 支持。

如果在使用 MyISAM 表时操作被中断,操作会立即中止,受影响的行(甚至每行中的数据)仍然受到影响,即使操作没有完成。

如果操作在使用 InnoDB 表时被中断,因为它使用具有原子性的事务,任何没有完成的事务都不会生效,因为没有进行提交。

表锁定与行锁定

当对 MyISAM 表运行查询时,它正在查询的整个表将被锁定。这意味着后续查询只会在当前查询完成后执行。如果您正在读取一个大表,和/或频繁的读写操作,这可能意味着大量的查询积压。

当对 InnoDB 表运行查询时,只有涉及的行被锁定,表的其余部分仍可用于 CRUD 操作。这意味着查询可以在同一个表上同时运行,前提是它们不使用同一行。

InnoDB 中的此功能称为并发。与并发性一样,有一个主要缺点适用于选定范围的表,因为在内核线程之间切换会产生开销,您应该对内核线程设置限制以防止服务器停止运行.

事务和回滚

当您在 MyISAM 中运行操作时,会设置更改;在 InnoDB 中,这些更改可以回滚。用于控制事务的最常用命令是 COMMIT、ROLLBACK 和 SAVEPOINT。1. COMMIT - 您可以编写多个 DML 操作,但只有在进行 COMMIT 时才会保存更改 2. ROLLBACK - 您可以放弃尚未提交的任何操作 3. SAVEPOINT - 在列表中设置一个点ROLLBACK 操作可以回滚到的操作

可靠性

MyISAM 不提供数据完整性 - 硬件故障、不正常关机和取消操作可能导致数据损坏。这将需要完全修复或重建索引和表。

另一方面,InnoDB 使用事务日志、双写缓冲区和自动校验和验证来防止损坏。在 InnoDB 进行任何更改之前,它将事务之前的数据记录到名为 ibdata1 的系统表空间文件中。如果发生崩溃,InnoDB 将通过重播这些日志自动恢复。

全文索引

InnoDB 在 MySQL 5.6.4 版本之前不支持 FULLTEXT 索引。在撰写本文时,许多共享主机提供商的 MySQL 版本仍然低于 5.6.4,这意味着 InnoDB 表不支持 FULLTEXT 索引。

但是,这不是使用 MyISAM 的正当理由。最好更改为支持 MySQL 最新版本的托管服务提供商。并不是说使用 FULLTEXT 索引的 MyISAM 表不能转换为 InnoDB 表。

结论

总之,InnoDB 应该是您选择的默认存储引擎。在满足特定需求时选择 MyISAM 或其他数据类型。


Gai*_*ius 31

还有一件事:您可以通过拍摄文件系统的快照来备份 InnoDB 表。备份 MyISAM 需要使用 mysqldump 并且不能保证一致(例如,如果您插入父表和子表,您可能只会在备份中找到子表的行)。

基本上,如果您有另一个数据副本并且仅将其缓存在 MySQL 中,例如允许从 PHP 网站访问它的标准方法,那么 MyISAM 很好(即它比平面 CSV 文件或用于查询和并发访问)。如果数据库是数据的实际的“底本”,如果你正在做的INSERT,并UPDATE使用来自用户的真实数据,那么它是愚蠢的比InnoDB的其他用途任何东西,在任何形式的大规模的MyISAM是不可靠和难以管理,你将做myisamchk一半的时间,否定任何性能提升......

(我的个人经验:MyISAM 中有一个 2 TB 的 DB)。


bso*_*ist 19

根据我的经验,最显着的区别是每个引擎处理锁定的方式。InnoDB 使用行锁定,而 MyISAM 使用表锁定。根据经验,我使用 InnoDB 来写入繁重的表,使用 MyISAM 来读取繁重的表。

其他重要的区别包括:

  1. InnoDB 支持事务和外键。MyISAM 没有。
  2. MyISAM 使用全文索引。
  3. MyISAM 在强制执行数据完整性方面做得很差。


Pat*_*ick 9

我倾向于将 MyISAM 视为 MySQL 的“默认”表选择,因此我将指出 InnoDB 的大多数用户的不同之处

  • 行级锁定
  • 外键强制执行
  • 交易支持
  • 高使用率系统的性能受到影响

  • 除了最新的 MySQL 版本不再使用 MyISAM 作为默认引擎。在 5.5 中,他们将默认值更改为 InnoDB :)。而且我不同意 InnoDB 通常只会受到“性能打击”的概括。精心设计的 InnoDB 表,具有适当的索引和配置良好的内存设置,可以使 InnoDB 表的性能与 MyISAM 中的相同模式一样好 (5认同)
  • 在许多“高使用率”的情况下,InnoDB 实际上表现 [更好](http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/)我的ISAM。MyISAM 是针对特定问题的特定工具,而 InnoDB 将在大多数情况下为您提供更好的服务(因此 MySQL 团队将其设为默认引擎)。正是因为 MyISAM 是长期以来唯一的引擎,所以 MySQL 社区养成了默认使用 MyISAM 的习惯,即使在 InnoDB 成熟之后。 (3认同)
  • 在 MySQL 5.6 开发周期的中途添加了对 InnoDB 的 FULLTEXT 搜索。[引用的 URL](http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html) 现在也涵盖 InnoDB。 (2认同)

Ant*_*nto 6

马来西亚

MYISAM 提供表级锁定,全文搜索。MYISAM 拥有最灵活的 AUTO_INCREMENTED 列处理所有存储引擎。MYISAM 不支持事务。

创新数据库

INNODB 是事务安全的存储引擎。INNODB 具有提交、回滚和崩溃恢复功能。INNODB 支持外键引用完整性。


Mah*_*til 6

包括 MySQL 5.6 更改

INNODB 存储引擎:

  • 它提供完全的 ACID(原子性、一致性、隔离性、持久性)合规性。多版本控制用于将事务彼此隔离。
  • InnoDB 在 MySQL 服务器或运行服务器的主机崩溃后提供自动恢复。
  • InnoDB 支持外键和参照完整性,包括级联删除和更新。
  • MySQL 5.6 基于 InnoDB 平台构建,完全集成为默认存储引擎
  • Persistent Optimizer Stats:提供更高的 InnoDB 索引统计数据的准确性,以及 MySQL 重启之间的一致性。
  • 修剪 InnoDB 表缓存:为了减轻具有大量表的系统的内存负载,InnoDB 现在释放与打开的表关联的内存。LRU 算法会选择时间最长但未被访问的表。
  • 支持全文搜索:一种特殊的索引,FULLTEXT 索引,帮助 InnoDB 处理涉及基于文本的列及其包含的单词的查询和 DML 操作。这些索引在物理上表示为整个 InnoDB 表。
  • InnoDB 在全文搜索上似乎比 MyISAM 快得多

因此,MyISAM如果您已经升级到 5.6,则使用Engine没有任何意义,如果没有,请不要等待升级到 MySQL 5.6。

使用 MySQL 5.6 的 InnoDB VS MyISAM 性能


wog*_*and 6

我的ISAM

MyISAM 是 MySQL 的存储引擎。在 MySQL 5.5 之前,它是 MySQL 的默认存储引擎。它基于较旧的 ISAM 存储引擎。MyISAM 针对具有大量读取操作、很少写入或根本没有写入的环境进行了优化。MyISAM 允许快速读取的原因是它的索引结构:每个条目指向数据文件中的一条记录,并且指针从文件的开头偏移。这样可以快速读取记录,尤其是在格式为 FIXED 时。因此,行的长度是恒定的。人们可能更喜欢 MyISAM 的一个典型领域是数据仓库,因为它涉及对非常大的表的查询,并且此类表的更新是在数据库不使用时(通常在晚上)进行的。插入也很容易,因为新行会附加到数据文件的末尾。然而,删除和更新操作更成问题:删除必须留空,否则行的偏移量会改变;更新也是如此,因为行的长度变短了;如果更新使行变长,则该行是碎片化的。要对行进行碎片整理并声明空白空间,OPTIMIZE TABLE命令必须被执行。由于这种简单的机制,通常 MyISAM 索引统计信息是相当准确的。MyISAM 的其他主要缺点是缺乏事务支持和外键。

数据库

InnoDB 是 MySQL 的存储引擎。MySQL 5.5 及更高版本默认使用它。它提供标准的符合 ACID 的事务功能,以及外键支持(声明性引用完整性)。它FULLTEXT按照 OpenGIS 标准实现 SQL 和 XA 事务、表空间、索引和空间操作。它作为标准包含在 MySQL AB 分发的大多数二进制文件中,一些 OEM 版本除外。该软件由 Oracle Corporation 双重许可;它是在 GNU 通用公共许可证下分发的,但也可以授权给希望在专有软件中结合 InnoDB 的各方。

货叉

MariaDB 有一个名为 Aria 的存储引擎,它被描述为“MyISAM 的崩溃安全替代品”。MariaDB 和 Percona Server 默认使用名为 XtraDB 的 InnoDB 分支。XtraDB 由 Percona 维护。Oracle InnoDB 的更改会定期导入 XtraDB,并添加了一些错误修复和额外功能。