我应该总是选择MySQL InnoDB而不是MyISAM吗?

20

有人告诉我InnoDB比MyISAM好得多。那么当我创建表时,是不是应该总是尝试使用InnoDB引擎而不是MyISAM?或者两者都具有自己的优势呢?


http://www.mikebernat.com/blog/MySQL_-_InnoDB_vs_MyISAM - Anthony Forloney
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 KEY),而MyISAM表不支持。

有多种情况可以展示两种引擎的优点。


12

简单回答:不应该。

以下是有关每个引擎的一些要点:

InnoDB

  • 完全支持外键约束和事务。(符合ACID标准)
  • 行级锁定。
  • 可以较快地执行INSERT语句。(可能也包括UPDATE语句)

MyISAM

  • 较快的SELECT语句。
  • 支持全文搜索。
  • BLOB和TEXT列可以建立索引。
  • 最大存储限制为InnoDB的4倍(256TB vs 64TB)。

更多详情请参考手册:


9

简单来说:

如果你需要事务支持和外键,应该使用InnoDB。

  • 如果你不需要上述功能且需要速度(更快的数据库操作),应该使用MyISAM。

6
你可能希望阅读这篇关于速度的文章:http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/。 - Pascal Thivent

4

在我看来,您应该始终优先选择InnoDB而不是MyISAM,因为事务支持是每个关系型数据库系统的核心。


1

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

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

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


0

你可以同时使用两种引擎。你可以使用InnoDB作为写入数据库/事务的引擎,但从一个反规范化的MyISAM数据库中读取数据。这样可以兼顾两者的优点。你可以确保数据的引用完整性,并且可以通过MyISAM以最快的速度读取它。


请问您能否提供一个链接,介绍如何同时使用两个引擎? - Amareswar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接