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

MySQL-索引优化-与游戏相关的用户,mysql,optimization,indexing,Mysql,Optimization,Indexing,我有一个名为games的表(通过int唯一) 我有一个名为members(用户名唯一)的表 在每个游戏中,一次最多可参与6名成员 然而,一名成员可以退出游戏,但我仍然需要保留他们参与该游戏的记录 我需要进行以下单独搜索: 会员的活动游戏 为会员辞职 在游戏中搜索一个空的位置(即一个未被成员填满的位置) 这张桌子的最佳结构是什么? 我是否应该为一个成员输入一个文本字段,并用逗号分隔所有已辞职游戏的列表?(我看到的一个问题是,我最终需要这些游戏的游戏信息,因此我随后需要在游戏表中单独搜索每个游戏编号

我有一个名为games的表(通过int唯一)

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

在每个游戏中,一次最多可参与6名成员

然而,一名成员可以退出游戏,但我仍然需要保留他们参与该游戏的记录

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

  • 会员的活动游戏

  • 为会员辞职

  • 在游戏中搜索一个空的位置(即一个未被成员填满的位置)

  • 这张桌子的最佳结构是什么? 我是否应该为一个成员输入一个文本字段,并用逗号分隔所有已辞职游戏的列表?(我看到的一个问题是,我最终需要这些游戏的游戏信息,因此我随后需要在游戏表中单独搜索每个游戏编号。这对于服务器来说似乎非常缓慢。)

    在游戏中,我是否应该有6个文本字段,例如SLOT1、SLOT2等,以及当前玩家的用户名?但是,辞职的成员又如何呢

    现在,我的问题的主要部分(造成上述所有混乱):

    如何在表上设置索引

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


    然后,根据我如何为每一场游戏分配辞职成员,我如何编制索引?

    使用交叉引用表。这是一个有三列的表,
    game
    (表
    games
    )的外键,
    user
    (表
    users
    的外键)和
    player\u number
    (1到6之间的可空整数,表示玩家占用了哪个“座位”;null表示玩家辞职)。(这可能会有所不同,具体取决于您的游戏工作方式以及您希望内容如何组合在一起,但最主要的是您有
    游戏
    用户
    的外键)

    上述建议中的主键是
    (游戏、用户、玩家号)
    (用户、游戏、玩家号)

    像这样搜索交叉引用表(对您和数据库来说)要比执行涉及跨六列ORing的查询容易得多


    根据@Jermin Bazazian的建议,切换到
    users
    表的整数主键可能是一个好主意。

    如果您开始为您的成员使用整数主键(而不是用户名,用户名很可能是字符串)如何?我可以看出这将有助于在SLOTS1中只需要一个int,等等,这样搜索起来可能会更快。然而,仅仅这样做肯定不会解决索引的主要问题。当然,这不是解决方案,但肯定是一个需要解决的重要问题。您可以看到,主键是否独立于数据很重要。如果一个成员因为任何原因改变了他的用户名,那么整个索引都应该重新排列,这在一个大数据库中是一个很大的负担。所以这不仅仅是字符串对整数的问题。谢谢Jermin。我明白你的意思。立即更新我的成员表。以前从未听说过外键。把它们读出来。它们听起来很棒。顺便说一下,如果我有外键,它会自动作为快速查找的索引吗?外键会自动索引。