我有一个PHP&基于MySQL(PHP 5.2.9和MySQL 5.0.91)。最近我遇到的问题是,当我在表中删除数千行旧数据时,整个站点有时会冻结。我一直遇到一些问题,当查询必须等待我假设的表锁并且游戏无法按预期运行时会发生奇怪的事情。
我的所有表都是MyISAM,每秒运行900多个查询。在整个数据库(约150个表)中,88%的查询是读取,只有12%的写入,但是一些表更接近50/50并且每秒从各种客户端读取和写入大量数据(这是一个多人游戏)。这些表还可存储1M-5M行的任何内容。
我知道MyISAM应该读得更快,但InnoDB不必在写入时锁定整个表。我在这里和其他网站上经历了很多主题,但我仍然不确定如何解决这些问题。
答案 0 :(得分:8)
MyISAM的最大问题是它对UPDATE和DELETE命令使用表级锁定,因此如果要从数据库中删除记录,则在该查询运行时,每个其他更新或删除都将被阻止。
InnoDB使用行级锁定,因此只有被更新的记录才会被阻止,因为它应该是显而易见的原因。
InnoDB还有许多有用的功能,如支持transacions和外键约束,这使它成为我和其他开发人员的首选引擎。
就读取速度而言,InnoDB存储了由主键排序的记录,这使得检索PK所记录的记录要快得多(像SELECT foo FROM bar WHERE id = baz;
这样的事情)。 MyISAM或多或少按照它们添加到数据库的顺序存储其记录,这意味着如果您主要通过添加日期记录进行搜索,可以更快,例如财务跟踪等你可能想抓住某一天发生的所有交易。
Wikipedia详述了两个引擎之间的许多主要差异,但足以说明在99%的情况下,您可能想要使用InnoDB。
我能想到的唯一情况MyISAM有一个明显的胜利,如果你需要全文搜索的支持。 MyISAM支持FTS,但InnoDB不支持。即便如此,你最好还是使用第三方系统,比如Sphinx,而不是使用MyISAM。
答案 1 :(得分:1)
如果您有任何类型的复杂数据模型,并且您被迫使用MySQL或其众多分支之一,那么请使用支持外键引用的事务存储引擎。否则你将不得不重新重新发明数据完整性“轮子”,这不是很有趣并且容易出错(特别是当你发现你的数据在整个地方都存在完整性问题时,你错过了正确的信息把它放回原处。
我建议使用像PostgreSQL这样的东西,如果你能够这样做,因为这样的健壮性功能是内置的。如果您的应用程序增长到需要的卷,您仍然可以平衡服务器之间的负载。