19

有人刚刚告诉我,InnoDB 比 MyISAM 好得多。那么当我创建表时,我是否应该总是尝试使用 InnoDB Engine 而不是 MyISAM?还是两者都有很大的好处?

4

6 回答 6

35

MyISAM是无事务和堆组织的。记录由表中的行偏移量标识,索引将此偏移量存储为行指针。

InnoDB支持事务并且是索引组织的。记录由 的值标识PRIMARY KEY(或者隐藏的内部列没有PRIMARY KEY定义)并存储在B-Tree. 二级索引将 的值存储PRIMARY KEY为行指针。

涉及全表扫描或二级索引查找的查询通常在MyISAM表上更快。

涉及PRIMARY KEY查找的查询通常在InnoDB表上更快。

MyISAM表将表中的记录数存储在表的元数据中,这就是查询如下的原因:

SELECT  COUNT(*)
FROM    myisamtable

是即时的。

MyISAM表完全锁定在DML操作上(有几个例外)。

InnoDB表锁定单个记录和索引间隙,但是这些是被扫描的记录和间隙,而不仅仅是那些与WHERE条件匹配的记录和间隙。这可能导致记录被锁定,尽管它们不匹配。

InnoDB表支持参照完整性FOREIGN KEYMyISAM桌子没有。

有几种情况可以显示两种引擎的优势。

于 2009-12-28T16:08:41.493 回答
11

简单的回答:不,你不应该。

关于每个引擎的几点:

InnoDB

  • 完全支持外键限制和事务。(符合 ACID 标准)
  • 行级锁定。
  • 可以说更快的 INSERT 语句。(可能还有更新)

MyISAM

  • 更快的 SELECT 语句。
  • 支持全文搜索
  • BLOB 和 TEXT 列可以被索引
  • 与 InnoDB 相比,最大存储限制为 4 倍(256TB 与 64TB)

在手册中查看更多信息:

于 2009-12-28T16:24:53.830 回答
8

简而言之:

你应该使用 InnoDB:

  • 如果您需要交易支持
  • 如果你需要外键

你应该使用 MyISAM:

  • 如果您不需要以上内容并且
  • 你需要速度(更快的数据库操作)
于 2009-12-28T16:09:23.303 回答
4

恕我直言,您应该总是更喜欢InnoDBMyISAM因为事务支持是每个关系数据库系统的核心。

于 2009-12-28T16:09:54.363 回答
1

InnoDB 是一个完全符合 ACID 的数据库引擎,因此提供对事务等的支持。因此,它可能比 MyISAM 数据库慢,后者倾向于在不同的方向上进行优化。

因此,如果您需要事务,InnoDB(或其他 RDBMS,如 PostgreSQL)是显而易见的选择。

维基百科上有一个合理的比较

于 2009-12-28T16:10:40.350 回答
0

你可以同时使用。您可以将 InnoDB 用于写入数据库/事务,但从非规范化的 MyISAM 数据库中读取。这提供了两全其美的效果。您知道您的数据在 InnoDB 的引用完整性下是安全的,并且您可以使用 MyISAM 尽可能快地读取它。

于 2009-12-28T16:19:08.197 回答