首页 文章

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

提问于
浏览
2

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

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

我知道MyISAM应该读得更快,但InnoDB不必在写入时锁定整个表 . 我在这里和其他网站上经历了很多主题,但我仍然不确定如何解决这些问题 .

2 回答

  • 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

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

    我建议使用类似PostgreSQL的东西,如果你能够这样做,因为这样的健壮性功能是内置的 . 如果应用程序增长到需要的卷,您仍然可以 balancer 服务器之间的负载 .

相关问题