有人告诉我InnoDB比MyISAM好得多。那么当我创建表时,是不是应该总是尝试使用InnoDB引擎而不是MyISAM?或者两者都具有自己的优势呢?
有人告诉我InnoDB比MyISAM好得多。那么当我创建表时,是不是应该总是尝试使用InnoDB引擎而不是MyISAM?或者两者都具有自己的优势呢?
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。
在我看来,您应该始终优先选择InnoDB
而不是MyISAM
,因为事务支持是每个关系型数据库系统的核心。
InnoDB是一个完全符合ACID标准的数据库引擎,因此支持事务等功能。因此,它可能比MyISAM数据库慢,后者往往在不同方向上进行优化。
因此,如果您需要事务处理,InnoDB(或其他RDBMS,如PostgreSQL)是明显的选择。
在维基百科上有一个合理的比较。
你可以同时使用两种引擎。你可以使用InnoDB作为写入数据库/事务的引擎,但从一个反规范化的MyISAM数据库中读取数据。这样可以兼顾两者的优点。你可以确保数据的引用完整性,并且可以通过MyISAM以最快的速度读取它。