What's the difference between MyISAM and InnoDB?
我知道之前已经问过这个问题,但大部分时间都会询问与特定数据库或表格有关的问题。 我无法在这个网站上找到描述两个引擎及其差异的答案,而不考虑某些特定数据库。
我希望将来能够在设计表或数据库时做出更明智的决策,所以我正在寻找关于两个存储引擎之间差异的全面答案。
MyISAM和InnoDB有什么区别,在尝试在一个或另一个之间做什么时,我应该寻找什么?
-
目前正在Meta讨论这个问题
-
嗨斯科特,我对你的问题的措辞进行了轻微编辑,试着让它重新开启。如果我过多地更改了您的问题,请随意进行进一步编辑或回滚更改。我认为这个问题很好,下面给出的答案很好。我已经投票重新开放,但仍需要重新开放4张其他选票。
-
我很欣赏编辑和重新打开的任何帮助。我认为这是一个很好的答案的重要问题。
-
@Rachel我相信我们会在这里不同意,但你不是只是把这个问题变成一个没有建设性的问题吗?即差异清单,利弊,意见......
-
@Bart我不这么认为,因为这两种技术非常相似,并且在相同的过程中使用相同的东西(参见维基百科链接),并且它们之间只有少数差异。最终结果不应该是一长串的答案,例如大多数非建设性的问题,而只是一个或两个指出这些差异是什么以及当你应该使用一个而不是另一个时它会产生什么影响。
-
之前提到的其他类似问题:MyISAM与InnoDB,InnoDB和MyISAM之间的区别?InnoDB和MyISAM之间的主要区别是什么?
-
我认为这是一个很好的问题,但总是最好的答案是"它取决于!"。它太主观了,正如第一个答案所暗示的那样,需要了解你想要实现的目标 - 这是你在问题中没有涉及的内容。
-
rorguide.blogspot.in/2011/06/…
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,并且如果我们依赖于某些不受支持的行为,我们必须考虑这一点。这种差异可能被认为是一个缺点;也许有人会认为这是一个"大劣势"。请注意,在MySQL 8.0中修改了AUTO_INCREMENT值的初始化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引擎忽略ROLLBACK,COMMIT和START TRANSACTION语句。使用MyISAM,每个DML语句都被视为一个单独的事务,就像启用AUTO_COMMIT一样操作。
MYISAM:
MYISAM支持表级锁定
MyISAM专为速度需求而设计
MyISAM不支持外键,因此我们用MYISAM调用MySQL是DBMS
MyISAM使用单独的三个不同文件将其表,数据和索引存储在磁盘空间中。 (tablename.FRM,tablename.MYD,tablename.MYI)
MYISAM不支持交易。您无法使用MYISAM提交和回滚。一旦发出命令就完成了。
MYISAM支持全文搜索
您可以使用MyISAM,如果表更加静态,有大量选择,更少更新和删除。
INNODB:
InnoDB支持行级锁定
InnoDB旨在处理大量数据时的最佳性能
InnoDB支持外键,因此我们用InnoDB调用MySQL是RDBMS
InnoDB将其表和索引存储在表空间中
InnoDB支持交易。您可以使用InnoDB进行提交和回滚
-
注意:如果在创建表时设置了innodb_file_per_table选项,InnoDB可以将单个表存储在单独的文件中,类似于MyISAM。
-
在v5.6中引入了InnoDB对全文索引的支持。
-
如果你有很少的插入/更新/删除但是加载了选择,那么InnoDB中的全文索引就不那么方便了。
-
MyISAM designed for need of speed与InnoDB designed for maximum performance when processing high volume of data是什??么意思?什么是diskspace vs table space?为什么You can use MyISAM, if the table is more static with lots of select and less update and delete?您也可以使用InnoDB。你能为你的陈述提供论据吗?
-
Domi,你的问题超出了范围。请阅读文档,交配。
-
版本5.5之后的@innoDB它将支持全文搜索