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 表可能会让你有非常坏的体验。