MySQL - 索引优化 - 与游戏相关的用户

标签 mysql optimization indexing

我有一个名为 games 的表(由 int 唯一)。

我有一个名为 Members 的表(用户名唯一)。

每场游戏一次最多可有 6 名成员参与。

但是,成员(member)可以退出游戏 - 但我仍然需要保留他们参与该游戏的记录。

我需要进行以下单独的搜索:

  1. 成员(member)的活跃游戏。

  2. 为成员(member)退出游戏。

  3. 在游戏中搜索空位(即未被成员填充的位置)。

对此最好的表结构是什么? 我是否应该为成员(member)添加一个文本字段,其中包含所有已退出游戏的列表,并以逗号分隔? (我看到的一个问题是我最终需要这些游戏的游戏信息,因此我随后需要在游戏表上对每个游戏编号进行单独搜索。这对于服务器来说似乎非常缓慢。 )

在游戏中,我应该有 6 个文本字段,例如 SLOT1、SLOT2 等以及当前玩家的用户名吗?但话又说回来,辞职的成员(member)怎么办?

现在是我问题的主要部分(这导致了上述所有困惑):

如何在表上设置索引?

当我进行搜索时,我会在游戏中查看 SLOTS1 等,看看是否有与玩家用户名匹配的内容。所以这是一个 6 次 ORed 搜索。我该如何优化这些操作的数据库索引?

那么根据我对每场比赛的退会成员(member)的处理方式,我该如何做索引呢?

最佳答案

使用交叉引用表。这是一个包含三列的表,game(表games的外键),user(表users的外键) )和 player_number(1 到 6 之间可为空的整数,指示玩家占据哪个“席位”;null 表示玩家退出)。 (根据您的游戏如何工作以及您希望如何将内容组合在一起,这方面可能存在变化,但最主要的是您拥有 gamesusers 的外键.)

上述建议中的主键可以是 (game, user,player_number)(user, game,player_number)(根据您的方便而定)。

搜索这样的交叉引用表比执行涉及跨六列进行“或”运算的查询要容易得多(对于您和您的数据库而言)。

按照 @Jermin Bazazian 的建议,将 users 表切换到整数主键可能是个好主意。

关于MySQL - 索引优化 - 与游戏相关的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387914/

相关文章:

c# - NuGet添加引用错误---无法安装包

performance - 如何过滤掉indexsearcher.search()函数返回的 "Hits"结果?

java - 为什么删除功能在我的 jsp 文件中不起作用?

mysql - MySQL复制

c - 为什么调用函数时会有开销?

python - MATLAB 和 Python 中线性规划的冲突解决方案

MySQL:ORDER BY 或 GROUP BY 慢?

sql-server - 在线索引重建期间INSERT超时

MySQL 索引仅用于最大值和最小值

mysql - 如何根据另一个表过滤结果。 (我猜是反向连接?)