Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 针对20000或更多用户的MySQL数据库优化_Php_Mysql_Database_Optimization - Fatal编程技术网

Php 针对20000或更多用户的MySQL数据库优化

Php 针对20000或更多用户的MySQL数据库优化,php,mysql,database,optimization,Php,Mysql,Database,Optimization,我一直在寻找一些优化技巧,因为我正在做一个RPG修改,它使用MySQL通过PHP存储数据 我使用一个唯一的表,以他的唯一ID在列中存储所有用户信息,并且我必须为每个用户存储(许多?)数据。武器和其他信息 我使用爆炸和内爆作为存储武器的方法,例如,在一列中使用“文本”值。我不知道这是否是一个好的做法,我也不知道如果我让成千上万的玩家进行大量的更新、选择等请求,我是否会有性能问题 我读到一个连接表可能更好地存储武器和所有这些信息,但我不知道这是否会得到更好的信息,您可以通过explode方法请求它

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

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

我使用爆炸和内爆作为存储武器的方法,例如,在一列中使用“文本”值。我不知道这是否是一个好的做法,我也不知道如果我让成千上万的玩家进行大量的更新、选择等请求,我是否会有性能问题

我读到一个连接表可能更好地存储武器和所有这些信息,但我不知道这是否会得到更好的信息,您可以通过explode方法请求它

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

它至少可以存储100个项目,我不知道在不同的表中为每个用户创建100条记录并一直调用所有记录是否比只调用列并使用explode更好

我还想提高我的技能和知识,尽我所能使MySQL数据库达到最佳性能

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


谢谢,很抱歉我愚蠢的英语语法。

是的,最好用几张表而不是一张表。数据库性能更好,更易于理解,更易于维护,使用也更简单

让我们建议一个用户拥有多个具有多种功能的武器(但并非所有武器中唯一的)。在游戏的某个地方,你只需要知道一个特定功能的价值:

  • 按照您的方式进行操作,您需要在users表中找到用户行,在列中提取,分解几次,这样您就有了自己的值,但如果您想更改它并保存它,则会更加复杂

  • 更好的方法是有一个用于用户详细信息(登录、密码、电子邮件等)的表,另一个保存用户武器的表(武器名称,可能是图像)和一个保存所有功能、武器特殊威力的表。你们也可以把所有武器的所有可能特征都放在额外的桌子上。这样,若您已经从用户表中知道了用户id,那个么在sql查询中只需连接两个表,就可以得到用户的特定武器特性的值

表的伪模式示例:

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

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

规范化表数据几乎总是最佳做法。这条规则有一些例外(特别是在高容量数据库中),但在您了解如何正确规范化和索引表之前,您可能不需要担心这些例外

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

因此,在您的情况下,您有用户-这是一个表。每个用户可能有多个武器。所以,你现在有了一张武器桌。由于多个不同的用户可能拥有相同的武器,而每个用户可能拥有多个武器,因此他们之间存在多对多关系,因此您应该有一个表“users\u-wearms”或类似的表,该表只将用户id与武器id关联

现在说用户都可以拥有护甲。因此,现在您添加了一个armor表和一个users\u armor表(这可能也是多对多)


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

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

如果没有,您可以尝试许多不同的方法:

  • 查找并优化运行缓慢的查询
  • 非规范化查询-有时会降低性能
  • 更改应用程序中使用的数据访问模式
  • 将数据存储在文件系统中或使用NoSQL/polyglot持久性解决方案
    您应该阅读一些关于数据库规范化和如何连接表的内容。你所做的将意味着你需要代码来分离武器。如果网站变得更大,这将成为维护的噩梦。一般来说,拥有数百万个索引正确的行比拥有数千个索引错误的行要好。想象一个查询,找到谁有一个特定的武器-有一个连接表,这很容易。使用explode/Inflode,您必须计算数据库中每一行的内容。我建议您需要从武器中删除用户id,并创建一个更好地表示多对多关系的用户武器表。是的,我知道。我只想提供一个简单一点的例子。谢谢,伙计。但是,如果我有一个包含用户信息和用户ID的表,一个包含武器ID的表和所有的表,那么我需要创建一个包含其他内容的第三个表?我也必须在武器表中添加用户ID?不,武器表根本没有用户ID。将用户与其武器联系起来的唯一方法是通过用户武器表。user_-wearms表只需要两个字段(带复合主键)——user_-id和wearm_-id。问题是您假设我希望该表定义武器,但事实并非如此。我想做一个清单的武器,这是已经通过PHP定义。因此,有一个物品的数量和ID,以及所有者(