我有一款基于 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 还有很多有用的特性,例如支持事务和外键约束,这使它成为我和其他开发人员的首选引擎。
就读取速度而言,InnoDB 按主键顺序存储其记录,这使得通过 PK 检索记录的速度要快得多(例如 SELECT foo FROM bar WHERE id = baz;
). MyISAM 或多或少地按照它们添加到数据库的顺序存储它的记录,这意味着如果您主要按记录添加的日期进行搜索,它可以更快,例如财务跟踪之类的东西您可能想要获取某一天发生的所有交易。
Wikipedia详细介绍了两个引擎之间的许多主要差异,但足以说明在 99% 的情况下,您可能想要使用 InnoDB。
我能想到的唯一情况是 MyISAM 有明显的胜利是如果您需要支持全文搜索。 MyISAM 支持 FTS,但 InnoDB 不支持。即便如此,您最好还是使用第三方系统(例如 Sphinx),而不是使用 MyISAM。
关于php - 我应该使用 MyISAM 还是 InnoDB(或其他)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466670/