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

Jam*_*son 2 php mysql myisam innodb

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

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

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

Age*_*rum 8

MyISAM的最大问题是它对UPDATE和DELETE命令使用表级锁定,因此如果要从数据库中删除记录,则在该查询运行时,每个其他更新或删除都将被阻止.

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

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

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

维基百科详述了两个引擎之间的许多主要差异,但足以说明在99%的情况下,您可能想要使用InnoDB.

我能想到的唯一情况MyISAM有明显的胜利,如果您需要全文搜索支持.MyISAM支持FTS,但InnoDB不支持.即便如此,你最好还是使用像Sphinx这样的第三方系统,而不是使用MyISAM.