我知道以前也有人问过这个问题,但大多数情况下,这个问题是与特定的数据库或表相关的。我在这个网站上找不到一个答案,描述了这两个引擎和他们的差异,而不尊重某些特定的数据库。

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

MyISAM和InnoDB之间的区别是什么,当我试图在一个或另一个之间做出决定时,我应该寻找什么?


当前回答

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

如果我们需要数据库强制外键约束或支持事务,我们选择InnoDB(即两个或多个DML操作所做的更改作为一个工作单元处理,所有的更改要么应用,要么恢复)。MyISAM引擎不支持这些特性。

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

你提到的两个引擎(InnoDB和MyISAM)有不同的设计目标。MySQL还有其他存储引擎,它们有自己的设计目标。

在InnoDB和MyISAM之间进行选择时,第一步是确定我们是否需要InnoDB提供的特性。如果不是,那么MyISAM也可以考虑。

(在这个论坛上)如果没有对问题空间进行更详细的讨论,对差异进行更详细的讨论是相当不切实际的……应用程序将如何使用数据库、表的数量、表的大小、事务负载、选择、插入、更新的卷、并发需求、复制特性等。


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

其他回答

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

如果我们需要数据库强制外键约束或支持事务,我们选择InnoDB(即两个或多个DML操作所做的更改作为一个工作单元处理,所有的更改要么应用,要么恢复)。MyISAM引擎不支持这些特性。

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

你提到的两个引擎(InnoDB和MyISAM)有不同的设计目标。MySQL还有其他存储引擎,它们有自己的设计目标。

在InnoDB和MyISAM之间进行选择时,第一步是确定我们是否需要InnoDB提供的特性。如果不是,那么MyISAM也可以考虑。

(在这个论坛上)如果没有对问题空间进行更详细的讨论,对差异进行更详细的讨论是相当不切实际的……应用程序将如何使用数据库、表的数量、表的大小、事务负载、选择、插入、更新的卷、并发需求、复制特性等。


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

MYISAM:

MYISAM supports Table-level Locking MyISAM designed for need of speed MyISAM does not support foreign keys hence we call MySQL with MYISAM is DBMS MyISAM stores its tables, data and indexes in diskspace using separate three different files. (tablename.FRM, tablename.MYD, tablename.MYI) MYISAM not supports transaction. You cannot commit and rollback with MYISAM. Once you issue a command it’s done. MYISAM supports fulltext search You can use MyISAM, if the table is more static with lots of select and less update and delete.

INNODB:

InnoDB支持行级锁 InnoDB的设计是为了在处理大量数据时获得最大的性能 InnoDB支持外键,因此我们称MySQL与InnoDB是RDBMS InnoDB将表和索引存储在一个表空间中 InnoDB支持事务处理。你可以使用InnoDB提交和回滚