有人刚刚告诉我,InnoDB 比 MyISAM 好得多。那么当我创建表时,我是否应该总是尝试使用 InnoDB Engine 而不是 MyISAM?还是两者都有很大的好处?
6 回答
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 KEY
。MyISAM
桌子没有。
有几种情况可以显示两种引擎的优势。
简而言之:
你应该使用 InnoDB:
- 如果您需要交易支持
- 如果你需要外键
你应该使用 MyISAM:
- 如果您不需要以上内容并且
- 你需要速度(更快的数据库操作)
恕我直言,您应该总是更喜欢InnoDB
,MyISAM
因为事务支持是每个关系数据库系统的核心。
InnoDB 是一个完全符合 ACID 的数据库引擎,因此提供对事务等的支持。因此,它可能比 MyISAM 数据库慢,后者倾向于在不同的方向上进行优化。
因此,如果您需要事务,InnoDB(或其他 RDBMS,如 PostgreSQL)是显而易见的选择。
维基百科上有一个合理的比较
你可以同时使用。您可以将 InnoDB 用于写入数据库/事务,但从非规范化的 MyISAM 数据库中读取。这提供了两全其美的效果。您知道您的数据在 InnoDB 的引用完整性下是安全的,并且您可以使用 MyISAM 尽可能快地读取它。