我应该使用MyISAM还是InnoDB(或其他)?

我有一个基于PHP和MySQL的在线游戏(PHP 5.2.9和MySQL 5.0.91)。 最近我一直有问题,整个网站有时在特定时间冻结,当我删除表中的数千行旧数据。 当查询必须等待我所假设的表锁并且游戏无法按预期运行时,我也遇到了奇怪事情发生的问题。

我所有的表都是MyISAM,它每秒运行900多个查询。 在整个数据库(大约150个表)中,88%的查询是读取数据,只有12%的数据写入,但少数表格更接近50/50,并且每秒钟从多个客户端读取和写入多次数据(这是一款多人游戏)。 这些表格还可以存储1M-5M行的任何地方。

我知道MyISAM应该读得更快,但InnoDB不必在写入时锁定整个表。 我在这里和其他网站上经历了一堆话题,但我仍然不知道该怎么做来解决这些问题。


MyISAM最大的问题在于它使用UPDATE和DELETE命令的表级锁定,因此如果您要从数据库中删除记录,则每次更新或删除都会在查询运行时阻塞。

InnoDB使用行级锁定,因此只有正在更新的记录会被阻塞,因为它应该是显而易见的原因。

InnoDB还有很多有用的功能,比如支持transacions和外键约束,这使它成为我和其他开发人员的首选引擎。

就读取速度而言,InnoDB存储由主键排序的记录,这使得检索由PK搜索的记录(例如SELECT foo FROM bar WHERE id = baz; )的速度快得多。 MyISAM按照它们添加到数据库中的顺序或多或少地存储它的记录,这意味着如果您主要按日期添加记录进行搜索,那么记录速度会更快,例如,您可能想要抓取所有事务的财务跟踪发生在某一天。

维基百科详细介绍了两种引擎之间的主要差异,但足以说明在99%的情况下,您可能想要使用InnoDB。

我能想到的唯一情况MyISAM有一个明确的胜利,就是如果你需要全文检索的支持。 MyISAM支持FTS,但InnoDB不支持。 即使那样,你最好使用第三方系统,比如Sphinx,而不是使用MyISAM。


如果您有任何种类的复杂数据模型,并且您不得不使用MySQL或其中的一个分支,那么请使用支持外键引用的事务性存储引擎。 否则,您将不得不重新发明数据完整性“轮子”,而这并不好玩,并且容易出错(特别是当您发现数据在整个地方都存在完整性问题时,并且您错过了正确的信息以把它放回去。

我建议使用PostgreSQL之类的东西,如果你能这样做的话,因为这样的鲁棒性功能是内置的。 如果您的应用程序增长到需要的容量,您仍可以平衡服务器之间的负载。

链接地址: http://www.djcxy.com/p/52227.html

上一篇: Should I be using MyISAM or InnoDB (or something else)?

下一篇: InnoDB vs MyISAM