【问题标题】:MySQL database optimization for 20.000 users or more为 20.000 个或更多用户优化 MySQL 数据库
【发布时间】:2012-12-02 18:29:46
【问题描述】:

我一直在寻找一些优化技巧,因为我正在做一个使用 MySQL 通过 PHP 存储数据的 RPG 修改。

我正在使用一个唯一的表通过他的唯一 ID 将所有用户信息存储在列中,并且我必须为每个用户存储(很多?)数据。武器和其他信息。

我正在使用爆炸和内爆作为存储武器的方法,例如,在具有“文本”值的列中。我不知道这是否是一个好习惯,我不知道如果我让成千上万的玩家执行大量的 UPDATES 、 SELECT 等请求,我是否会遇到性能问题。

我了解到,Junction 表可能更好地存储武器和所有这些信息,但我不知道这是否会获得您通过 explode 方法请求的更好的信息。

我的意思是,我应该将所有武器存储在一个不同的表中,每个武器都有他的信息(每个武器都有一些信息,比如不同的列,我在主爆炸中使用多重爆炸)和用户所有者武器来识别武器,而不仅仅是将它们放在一列中。

至少可以存储 100 个项目,我不知道在不同的表上为每个用户创建 100 条记录并始终调用所有记录是否比仅调用列并使用爆炸更好.

我还想提高我的技能和知识,以制作性能最好的 MySQL 数据库。

我希望有人能告诉我一些事情。

谢谢,对不起我愚蠢的英语语法。

【问题讨论】:

  • 您应该阅读一些有关数据库规范化以及如何连接表的内容。您所做的将意味着您需要代码来分离武器。如果网站变得更大,这将成为维护的噩梦。
  • 作为一般规则,拥有数百万个正确索引的行比拥有数千个索引错误的行要好。想象一个查询来查找谁拥有特定武器 - 使用联结表,这很容易。使用explode/implode,您必须计算数据库中每一行的内容。

标签: php mysql database optimization


【解决方案1】:

规范化表数据几乎总是最佳做法。此规则有一些例外情况(尤其是在容量非常大的数据库中),但您可能无需担心这些例外情况,直到您首先了解如何正确规范化和索引您的表。

通常,尝试以模仿现实世界对象及其相互关系的方式排列您的表格。

因此,在您的情况下,您有用户 - 那是一张桌子。每个用户可能拥有多种武器。所以,你现在有一个武器表。由于多个不同的用户可能拥有相同的武器并且每个用户可能拥有多个武器,因此他们之间存在多对多的关系,因此您应该有一个表“users_weapons”或类似的表,它只会将用户 ID 与武器 ID 关联起来.

现在说用户都可以拥有盔甲。所以现在你添加一个 Armor 表和一个 users_armor 表(因为这也可能是多对多的)。

只需考虑游戏的不同方面,并尝试了解它们之间的关系。在您编写任何代码来实际实现功能之前,请确保您可以在数据库表中对这些关系进行建模。

【讨论】:

  • 谢谢伙计。但是,如果我有一张带有用户信息和用户 ID 的表格,一张带有武器 ID 的武器表格等等,我需要用其他东西制作第三张表格吗?我也必须在武器表中添加用户 ID?
  • 不,武器表根本没有用户 ID。将用户与其武器相关联的唯一方法是通过 user_weapons 表。 user_weapons 表只需要两个字段(带有复合主键) - user_id 和 Weapon_id。
  • 问题是您假设我希望该表定义武器,但事实并非如此。我想要一个武器清单,这些武器已经通过 PHP 定义了。因此,有物品的数量和 ID,以及所有者(玩家 ID)。那还是一样的情况吗?谢谢大家。
  • 那么武器不是数据库表吗?这看起来很奇怪,以后可能会有点问题,因为您想添加更多武器(在数据库中比在硬编码中更容易做到)。如果您想要一个数量列,只需将它添加到 user_weapons 到其中有 3 列(user_id、 Weapon_id、 Weapon_quantity)。
【解决方案2】:

是的,最好使用多张表而不是一张。更好的 db 性能,更容易理解,更容易维护和更简单的使用。

让我们建议一位用户拥有多种具有多种功能的武器(但在所有武器中并非独一无二)。在您的游戏中,您只需要了解一项特定功能的价值即可:

  • 按照自己的方式进行操作,您需要在 users 表中找到用户行,在列上获取,将其分解多次,这样您就有了您的价值,但如果您想更改它,它会变得更加复杂然后保存。

  • 更好的方法是有一个用于用户详细信息(登录名、密码、电子邮件等)的表格,另一个用于保存用户武器的表格(武器名称,可能是图像)和一个表格,其中将包含所有功能,特殊权力武器保留。您也可以将所有武器的所有可能功能保留在额外的表格中。这样,如果您已经从用户表中知道用户 ID,则只需在 sql 查询中加入 2 个表,您就可以获得用户特定武器的特征值。

表的伪模式示例:

users
    user_id
    user_name
    password
    email

weapons
    weapon_id
    user_id
    weapon_name
    image

weapons_features
    feature_id
    weapon_id
    feature_name
    feature_value

如果您真的想在数据库的文本字段中使用一些有序数据,请将其编码为JSONserialize。这样你就不必爆炸和内爆!

【讨论】:

  • 我建议您需要从武器中完全删除 user_id 并有一个 users_weapons 表来更好地表示多对多关系。
  • 是的,我知道。我只是想提供一个更简单的例子。
【解决方案3】:

正如所有人所说,通常您应该从规范化的数据库结构开始。 如果性能还可以,那就太好了,无事可做。

如果没有,你可以尝试很多不同的东西:

  1. 查找并优化运行缓慢的查询。
  2. 非规范化查询 - 有时连接会扼杀性能。
  3. 更改应用程序中使用的数据访问模式。
  4. 将数据存储在文件系统中或使用 NoSQL/多语言持久性解决方案。

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2012-07-20
    • 2010-12-12
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多