我有一个在线游戏,这是PHP和MySQL为基础(PHP 5.2.9和MySQL 5.0.91)。最近,我遇到了一些问题,在删除表中数千行旧数据时,整个网站有时会在特定时间冻结。我还遇到了一些问题,当查询必须等待我认为是表锁的时候,会发生一些奇怪的事情,并且游戏不能像预期的那样运行。
我所有的表都是MyISAM的,它每秒运行900多个查询。在整个数据库(~150个表)上,88%的查询是读的,只有12%是写的,但有一些表接近50/50,并且每秒从不同的客户端多次读取和写入大量数据(这是一个多人游戏)。这些表还可以存储1M-5M行。
我知道MyISAM的读取速度应该更快,但是InnoDB不必在写入时锁定整个表。我已经在这里和其他网站上浏览了一大堆主题,但我仍然不确定如何解决这些问题。
发布于 2010-12-17 08:25:55
MyISAM最大的问题是它对UPDATE和DELETE命令使用表级锁定,所以如果您要从数据库中删除一条记录,那么在该查询运行时,所有其他的update或delete都将阻塞。
InnoDB使用行级锁定,因此只有正在更新的记录才会阻塞,原因很明显。
InnoDB还有很多有用的特性,比如对事务和外键约束的支持,这使得它成为我和其他开发人员的首选引擎。
就读取速度而言,InnoDB存储按主键排序的记录,这使得检索按PK搜索的记录(如SELECT foo FROM bar WHERE id = baz;)的速度更快。MyISAM或多或少地按照记录被添加到数据库的顺序来存储记录,这意味着如果您主要是按添加记录的日期进行搜索,那么它可以更快,例如,像金融跟踪这样的事情,您可能想要获取某一天发生的所有交易。
Wikipedia详细介绍了这两个引擎之间的许多主要区别,但足以说明的是,在99%的情况下,您可能希望使用InnoDB。
我能想到的唯一一种情况是,如果你需要对全文搜索的支持,MyISAM会有一个明显的胜利。MyISAM支持FTS,但InnoDB不支持。即使这样,您最好使用第三方系统,比如Sphinx,而不是使用MyISAM。
发布于 2010-12-17 08:43:36
如果您有任何类型的复杂数据模型,并且您被迫使用MySQL或其众多分支之一,那么请使用支持外键引用的事务性存储引擎。否则,您将不得不重新发明数据完整性“轮子”,这并不有趣,而且容易出错(特别是当您发现数据到处都存在完整性问题,并且您缺少适当的信息来将其组合在一起时。
如果您能够做到这一点,我建议您使用像PostgreSQL这样的工具,因为这样的健壮性特性是内置的。如果您的应用程序增长到所需的容量,您仍然可以在服务器之间平衡负载。
https://stackoverflow.com/questions/4466670
复制相似问题