【问题标题】:What's the difference between MyISAM and InnoDB? [duplicate]MyISAM 和 InnoDB 有什么区别? [复制]
【发布时间】:2012-09-18 20:02:47
【问题描述】:

我知道这个问题以前曾被问过,但大多数时候是针对特定数据库或表提出的。我无法在此站点上找到描述这两个引擎及其差异的答案,而不考虑某人的特定数据库。

我希望将来能够在设计表或数据库方面做出更明智的决定,因此我正在寻找关于两种存储引擎之间差异的全面答案。

MyISAMInnoDB 之间有什么区别,在尝试选择其中一个时我应该寻找什么?

【问题讨论】:

  • 嗨,斯科特,我对您的问题的措辞做了一些修改,以尝试重新打开它。如果我对您的问题进行了太多更改,请随时 edit 它进一步或回滚更改。我认为这个问题很好问,下面给出的答案很好。我已经投票重新打开它,但它仍然需要 4 票才能重新打开。
  • @Rachel 我相信我们会在这里不同意,但你不是把这个问题变成了一个没有建设性的问题吗?即差异列表、优缺点、意见......
  • @Bart 我不这么认为,因为这两种技术非常相似,并且被相同的过程用于相同的事情(请参阅有问题的维基百科链接),并且只有少数区别它们之间。最终结果不应该像大多数非建设性问题那样是一长串答案,而应该只是一个或两个可能指出这些差异是什么以及何时应该使用其中一个而不是另一个的影响。
  • 我认为这是一个很好的问题,但最好用“这取决于!”来回答。这太主观了,正如第一个答案所暗示的那样,需要了解您想要实现的目标——您的问题中没有涵盖的内容。

标签: mysql database innodb myisam


【解决方案1】:

InnoDB 和 MyISAM 之间的主要区别(“关于设计表或数据库”您询问)是对“引用完整性”和“事务”的支持。

如果您需要数据库强制执行外键约束,或者您需要数据库支持事务(即由两个或多个 DML 操作所做的更改作为单个工作单元处理,所有更改要么应用,要么所有更改已恢复)然后您将选择 InnoDB 引擎,因为 MyISAM 引擎没有这些功能。

这是最大的两个区别。另一个很大的区别是并发性。使用 MyISAM,DML 语句将获得表上的排他锁,并且在持有该锁时,没有其他会话可以对表执行 SELECT 或 DML 操作。

您询问的这两个特定引擎(InnoDB 和 MyISAM)具有不同的设计目标。 MySQL 也有其他存储引擎,有自己的设计目标。

因此,在 InnoDB 和 MyISAM 之间进行选择时,第一步是确定您是否需要 InnoDB 提供的功能。如果没有,那么可以考虑使用 MyISAM。

如果没有对问题空间进行更详细的讨论,更详细地讨论差异是不切实际的(在这个论坛中)......应用程序将如何使用数据库,有多少表,表的大小,事务负载,大量的选择、插入、更新、并发要求、复制功能等。


数据库的逻辑设计要以数据分析和用户需求为中心;使用关系数据库的选择会在以后出现,甚至更晚会选择 MySQL 作为关系数据库管理系统,然后为每个表选择存储引擎。

【讨论】:

  • +1“参照完整性”和“交易”,但我希望这个问题很快就会结束。
  • InnoDB 有一个很大的缺点:它不记得自动增量值(它会在 MySQL 重新启动时将它们重置为表中的最高 id)。因此,如果您使用 InnoDB 并且需要唯一 id,则需要实施一种解决方法(例如,将最新的 id 保存在单独的表中)。
  • @Finesse:我的回答未能列举 所有 InnoDB 和 MyISAM 之间的差异。但是,是的,使用 AUTO_INCREMENT 的 InnoDB 行为是不同的,如果我们要使用 AUTO_INCREMENT,并且我们依赖于一些不受支持的行为,我们必须考虑这一点。这种差异可以被认为是一个缺点;也许有些人会认为这是一个“很大的劣势”。注意 AUTO_INCREMENT 值的初始化在 MySQL 8.0 中被修改了dev.mysql.com/doc/refman/8.0/en/…
  • 为了清楚起见,SELECT * FROM table_a; INSERT INTO table_a (column_1) VALUES ('whatever') 会被视为“交易”吗?
  • @Anthony:在 RDBMS 中,“事务”是一个工作单元。基本上,一组 DML 语句(一个或多个)以“START TRANSACTION”语句启动,并以“COMMIT”语句完成,或以“ROLLBACK”语句撤消。至于事务中结果集的一致性,这取决于“隔离级别”。为了清楚起见,MyISAM 引擎忽略了ROLLBACKCOMMITSTART TRANSACTION 语句。使用 MyISAM,每个 DML 语句都被视为一个单独的事务,就像启用了 AUTO_COMMIT 一样运行。
【解决方案2】:

MYISAM:

  1. MYISAM 支持表级锁定
  2. MyISAM 专为速度需求而设计
  3. MyISAM 不支持外键,因此我们称 MySQL 为 MySQL,MYISAM 是 DBMS
  4. MyISAM 使用单独的三个不同文件将其表、数据和索引存储在磁盘空间中。 (tablename.FRM, tablename.MYD, tablename.MYI)
  5. MYISAM 不支持事务。您不能使用 MISAM 提交和回滚。一旦你发出一个命令,它就完成了。
  6. MYISAM 支持全文搜索
  7. 您可以使用 MyISAM,如果表更静态,选择较多,更新和删除较少。

INNODB:

  1. InnoDB 支持行级锁定
  2. InnoDB 旨在在处理大量数据时获得最佳性能
  3. InnoDB 支持外键,因此我们称 MySQL 与 InnoDB 是 RDBMS
  4. InnoDB 将其表和索引存储在表空间中
  5. InnoDB 支持事务。您可以使用 InnoDB 提交和回滚

【讨论】:

  • 注意:InnoDB 可以将单个表存储在单独的文件中,类似于 MyISAM,如果在创建表时设置了 innodb_file_per_table 选项。
  • InnoDB support of Fulltext indexes 在 v5.6 中引入。
  • 全文索引在 InnoDB 中不是那么方便,如果你有很少的插入/更新/删除但有很多选择。
  • MyISAM designed for need of speedInnoDB designed for maximum performance when processing high volume of data 是什么意思? diskspacetable space 是什么?为什么是You can use MyISAM, if the table is more static with lots of select and less update and delete?你也可以使用 InnoDB。您能否为您的陈述提供论据?
  • @innoDB 5.5 以后将支持全文搜索
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 2013-03-18
  • 2011-04-18
  • 2015-11-23
  • 2013-02-13
  • 2011-04-26
  • 2016-09-24
相关资源
最近更新 更多