InnoDB 或 MyISAM 表在 MySQL 5.1 中是否提供更好的插入性能?

InnoDB 或 MyISAM 表在 MySQL 5.1 中是否提供更好的插入性能?

我需要尽快将行插入到新创建的表且没有索引的数据库中。我查看的行数约为 2000 万行,这并不多。InnoDB 或 MyISAM 表能否提供最佳性能?

显然,我还在研究其他批量加载技巧。

答案1

InnoDB 是事务性的,因此不必担心原子写入的 MyISAM 将会更快。

答案2

对于您描述的情况,MyISAM 将比 InnoDB 更快。如果您只是希望尽快将数据导入 MySQL,请查看加载数据文件

答案3

这是还没有人提及的事情。

如果将 MyISAM 表的行格式从 DYNAMIC(默认)转换为 FIXED,则可以将表的整体 SQL 性能提高至少 20%。

根据MySQL 数据库设计和调优第 71-73 页(ISBN 0-672-32756-1),只需在任何 MyISAM 表上运行以下命令:

ALTER TABLE tblname ROW_FORMAT=FIXED;

并且您将获得针对该表的查询性能的显著提升。

书中给出的示例表明,对动态行 MyISAM 表的查询比对固定行 MyISAM 表的查询要多执行 50%。然后,如果您使用 myisampack 对固定行 MyISAM 表进行压缩,则压缩的固定行 MyISAM 表的查询速度比未压缩的固定行 MyISAM 表快 10%。

这种方法有一个严重的缺点 ??? FIXED-row MyISAM 表至少是其 DYNAMIC-row MyISAM 对应表的两倍大。因此,如果您能够承受速度与空间之间的权衡,则应该选择 FIXED-row MyISAM 表。然后,所有查询都将更快,而无需任何额外的表结构更改。

您还可以针对 InnoDB 表运行 ALTER TABLE tblname ROW_FORMAT=FIXED;。如果您对 InnoDB 和 MyISAM 存储引擎中的表都执行此操作,那么您仍然不会拥有公平的竞争环境。优势总是属于 MyISAM。原因 ??? 所有非唯一索引查找都必须遍历非聚集索引,然后通过聚集索引进行 rowid 访问。MyISAM 索引最多只经过一个索引。

我对此并不只是猜测。大约 4 年前,我亲自拿了一个 2GB 的表,运行 ALTER TABLE,并将其扩展到 3.7GB。所有结果查询的平均速度比进行行格式更改之前快 20%。

如果您想要提高性能并且不介意增加文件大小,我强烈建议对所有 MyISAM 和 InnoDB 执行此操作。

相关内容