我们大多数的客户系统都运行MySQL。这样很好。但是大部分客户的MySQL引擎都是使用MyISAM。这样很糟糕。几乎所有的系统数据都应该只使用InnoDB;这样会很简单,当然下面也会讨论一些例外。 MySQL 有两种通常的数据存储引擎:MyISAM和InnoDB。 直到5.1版本(包括5.1),MyISAM还是默认和最常见的引擎,但同时也是现在很久未被更新的过时系统。它在许多情况下运行都比较缓慢,并且有在系 统崩溃时破坏数据的坏特性,外加没有事务处理机制和完整性参照机制(互联网系统很少使用),以及其他一些进阶的功能。 这主要是因为MyISAM只 有表级锁而没有像现代化系统一样的行级锁。这就意味着当一个用户/客户端在数据库中进行操作时,整张数据表都会被锁住(被锁的数据可能是几百万行),而且 其他的所有用户只有等待。你可以想象,这样不能很好的扩展到大型的系统。最近有些例外的SQL、INSERT语句和其他一些东西,但是在实际系统中 MyISAM的表现还是相当差的。 此外,它没有事务日志和分类,因此它只将数据写入Linux文件缓存并希望能最终写入磁盘。如果系统在 这个过程中崩溃或者丢失一些数据,MyISAM表会经常出现无法启动或者警告你需要修复表;它恢复数据的方法有限并且经常会丢失数据。另外,MyISAM 也很难正确的备份,备份的时候通常需要锁住整个系统的数据,这就意味着每天网站都要宕机或者无法使用15,30,60分钟或者更多。 相比 之下,InnoDB是一个更现代化的系统,并正在茁壮地发展,在InnoDB成员之中有多个版本可供选择,从最基础的引擎插件到进阶的增强版本,比如 XtraDB等。为了有更好的CPU和IO性能,更好的备份和锁表机制,提高统计和调试效率和更多优势,每个人都在用InnoDB。 另外,作为一 个系统,InnoDB支持多种关键功能,其中最重要的是事务日志和行级锁。事务日志记录真正的数据库事务,但更重要的是数据崩溃恢复和回滚。基于 InooDB方式的IO,能给予更安全数据保护和更好性能表现。另外,在大多数的情况下,行级锁可以提供更高的并发性能,因为用户只锁定他们正在写的数 据,而读数据永远不会被阻塞 。最近的性能测试显示,较MyISAM,InnoDB有着好的性能表现,尤其是在高负载的环境下。 通常来说,InnoDB表更块,更安全,功能更强大并且正变的越来越好。你应该总是使用它,除非有一些特殊的原因。 哪 些特殊的原因可能会使你不用InnoDB表呢? 至少有两种,首先是count(*)行为。在MyISAM表中,SELECT count(*)在没有WHERE条件时是很快速的。而InnoDB必须确切的计算出行数,这样就会变慢。当然,经常使用count(*)对程序来说不是 一个很好的方法(首先使用一个索引列会更快,比如:count(id) 并且很少会有一个好的语句不包括WHERE子句。 再则,MyISAM表允许在定期列中进行全文检索,而InnoDB不支持。通常在像Lucene或者Solr(或者在新版本MySQL中的Sphinx)系统中,真正的查询是在MySQL之外被完成的;在这种情况下,你可能需要使用MyISAM的文本表。 总体而言,简单的说就是每张表都应该使用InnoDB,只有很少的例外。 非常好的参考文章(出自TAG1): http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB