Mysql支持多种存储引擎,我们可以根据实际应用选择不同的存储引擎。Mysql包括的存储引擎有: MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED,常用的有:MyISAM,InnoDB,MEMORY,下面就这三种存储引擎做一个比较。


特点
MyISAM InnoDB MEMORY
存储限制 没有
64TB
事务安全
支持
锁机制 表锁 行锁
表锁
B树索引 支持 支持 支持
哈希索引
支持 支持
全文索引 支持

集群索引

支持
数据缓存
支持 支持
索引缓存 支持 支持 支持
数据可压缩 支持

空间使用 N/A
内存使用 中等
批量插入的速度
支持外键

支持

如何选择合适的存储引擎

例如,你在研究大量的临时数据,你也许需要使用内存存储引擎,内存存储引擎可以在内存中存储所有的表格数据,或者你需要一个支持事务处理的数据库,以确保事务处理不当时回退。对于复杂的应用系统可以根据实际情况选择多种存储引擎进行组合。决定使用一个什么样的存储引擎还是很值得我们去研究的。我们可以回答一下这些问题:

  • 你的数据有外键吗?

  • 需要事务支持吗?

  • 需要全文索引吗?

  • 你经常使用什么样的查询模式?

  • 你的数据有多大?

思考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,然而,我们其实并不会经常地去测试两百万行记录。所以,就算是慢一点,我们可以通过使用Sphinx从InnoDB中获得全文索引。

数据的大小,是一个影响你选择什么样存储引擎的重要因素,大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。数据库的在小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。而MyISAM可能会需要几个小时甚至几天来干这些事,InnoDB只需要几分钟。

您操作数据库表的习惯可能也会是一个对性能影响很大的因素。比如: COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会相当相当的快,但需要小心的是如果我们的主键太长了也会导致性能问题。大批的inserts 语句在MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。

所以,到底你使用哪一个呢?根据经验来看,如果是一些小型的应用或项目,那么MyISAM 也许会更适合。当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的。如果你正在计划使用一个超大数据量的项目,而且需要事务处理或外键支持,那么你真的应该直接使用InnoDB方式。但需要记住InnoDB 的表需要更多的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。