【问题标题】:How to deal with big tables in MySQL? (DB design for a Game)如何处理 MySQL 中的大表? (游戏的数据库设计)
【发布时间】:2011-11-16 17:32:41
【问题描述】:

假设我有一个 Games 表、一个 Players 表和一个 Users 表。

  • 每个游戏都有很多玩家
  • 每个玩家都有一个状态,例如“死亡”或“活着”。所以玩家不是用户。
  • 每个玩家都有一个用户

到目前为止,结构看起来还不错。但是我想知道,如果一天可能有数千场比赛(这种比赛的持续时间很短),并且每场比赛有 10 或 20 名玩家。我可能会在更少的时间内在 Players 表中获得数百万行超过一年。而且即使在比赛结束后,我也需要将每个球员都保存在桌子上,因为我希望能够重玩任何比赛。我很担心那个时候的性能,选择和更新会越来越慢,对吧?

有什么想法吗?

【问题讨论】:

  • 没有人(从字面上看,没有人)可以设计出不受某些性能问题影响的应用程序。甚至 twitter 和 facebook 开发团队(你知道 - 他们知道他们的工作非常好)也会遇到性能问题。所以我建议你从一些常见的模式开始,只要检测到真正的瓶颈,就可以改进它。
  • 是的,但我更喜欢按设计做事。例如,如果我的计算告诉我每天将有 100 万行新行,我将不得不在开始之前停下来重新考虑整个事情,而不是等待它成为一个“真正的瓶颈”一周稍后。
  • @rwilliams 那篇文章告诉我要避免在大表上进行连接。关于如何在学说 2 中做到这一点的任何想法?引用时会自动填充相关实体
  • @HappyDeveloper:仅适用于 3 个表架构 - 适当的索引足以优化。

标签: php mysql database-design doctrine-orm erd


【解决方案1】:

本质上这是一个可扩展性的问题。因为可扩展性是几乎所有流行的网站、游戏等都会遇到的问题,所以有一系列解决方案。首先,考虑到合理的数据库设计和索引的使用,现代数据库可以很好地处理数百万行数据。如果您的游戏如此受欢迎,以至于数据量超出了现代数据库的处理能力,并且您的企业有一些商业模式,那么您的收入可能足以聘请一流的专家来帮助您解决这个问题。

如果您刚刚开始实施游戏,我建议您将数据库和查询的微调留到以后,性能瓶颈很可能会出现在与您预期不同的地方。不要过早优化:)

【讨论】:

  • 谢谢,但正如我所说,我不认为这是过早的优化。我只是尽量不开始构建一些设计上不会顺利运行的东西。
【解决方案2】:

是的,经过很长时间,性能方面会出现一些问题,但是对这些表字段进行适当的索引会让您更轻松。

跟踪所有即将对您的表执行的选择和更新查询,并进行适当的索引。

你可以参考How MySQL Uses IndexesEXPLAIN Output Format

您还可以考虑一些逻辑,将一些游戏或记录在一段时间(如 1 个月或 2 个月)后归档到具有相同结构的另一个表中。

【讨论】:

  • 嘿,将旧游戏存档到单独的表格中听起来是个好主意。这或许就是答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2013-12-03
  • 2019-05-01
相关资源
最近更新 更多