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


特点
MyISAMInnoDBMEMORY
存储限制没有
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 表可能会让你有非常坏的体验。