【发布时间】:2010-12-30 12:30:24
【问题描述】:
有人刚刚告诉我,InnoDB 比 MyISAM 好得多。所以当我创建一个表时,我是否应该总是尝试使用 InnoDB Engine 而不是 MyISAM?还是两者都有很大的好处?
【问题讨论】:
标签: mysql database-design innodb myisam
有人刚刚告诉我,InnoDB 比 MyISAM 好得多。所以当我创建一个表时,我是否应该总是尝试使用 InnoDB Engine 而不是 MyISAM?还是两者都有很大的好处?
【问题讨论】:
标签: mysql database-design 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 KEYs)。 MyISAM 表没有。
有几种情况可以显示两种引擎的优势。
【讨论】:
InnoDB 是一个完全符合 ACID 的数据库引擎,因此提供对事务等的支持。因此,它可能比 MyISAM 数据库慢,而 MyISAM 数据库倾向于在不同的方向进行优化。
因此,如果您需要事务,InnoDB(或其他 RDBMS,如 PostgreSQL)是显而易见的选择。
Wikipedia 上有一个合理的比较
【讨论】:
恕我直言,您应该始终更喜欢 InnoDB 而不是 MyISAM,因为事务支持是每个关系数据库系统的核心。
【讨论】:
简单地说:
你应该使用 InnoDB:
你应该使用 MyISAM:
【讨论】: