更高效的SQL查询

时间:2011-12-15 13:16:14

标签: sql database database-performance

我正在建立一个"发现差异"多人游戏。

游戏的具体情况是:

  1. 每场比赛最多可以有10名球员。
  2. 用户不得两次看到相同的图片。
    (图片由 四个图像和用户必须"发现差异"他们之间)

  3. 我有数千的集合,甚至可能成千上万 图片可供选择。我面临的问题非常严重 找不到图片的非有效且不可扩展的方法 游戏玩家已经看到了。

    在我的数据库中,我有一个usage table,其中包含以下字段:

    1. picture_id
    2. USER_ID

    3. 我目前的解决方案如下:

      用户进入游戏,应用程序从数据库中选择一张未出现在该用户的使用表中的图片,对于每个进入的用户我运行相同的功能,只添加同一游戏中其他用户拥有的图片的值已经见过。

      我担心的是,一旦存在可供选择的数万张图片的数据库,并且之前的游戏已经填充了使用表,该功能将花费太长时间来破坏游戏的流程。

      这种方法的可扩展性不是很高,而且我预计会有相当稳定的流量,这意味着很多游戏正在播放。


      有没有人对如何改进这种逻辑或建议更好的数据库结构有任何建议?

3 个答案:

答案 0 :(得分:4)

您可以简单地在图片表中添加一个字段(不是用户/图片映射),用于标记图片是否已被使用。然后,您可以在使用图片时设置该标记,并将该字段编入索引以快速识别未使用的图片。这有效地将结果缓存到hasBeenUsed()函数。

有些人可能会在不同的方面提出反对意见,而这种过早的优化会导致一个高度混乱且紧密耦合的结构。惩罚未来的可维护性。

另一种方法是在用户/图片映射表中包含每个图片。如果未使用图片,则其关联的user_id保留为NULL。带有picture_id的索引将首先快速识别未使用的图片。

但最重要的是,它实际上取决于你必须进行随机选择的查询。很多时候(但并不总是)可扩展性差的算法可以用更多可扩展的算法替换,而根本不需要改变数据库结构。但要知道我们需要查看您的查询,以及有关数据的模式和行为信息(约束,可能是%未使用等)。

答案 1 :(得分:3)

我认为这是不成熟的优化。

虽然“成千上万”对于一个人来说听起来很多,但对于SQL引擎来说几乎没什么。有些实现甚至不会在50-60k行的表上使用索引,因为将整个内容加载到内存中会更快。

我建议使用EXISTS编写查询,这些查询在大多数实现中都会出现短路,并且应该足够快,以便达到您的目的。

如果您为表结构和/或某些示例数据发布了一些示例代码,我们可能会帮助查询,但我认为您无需担心。

答案 2 :(得分:0)

10个用户对10,000张图片 - 使用概率理论你需要选择11张图片(我建议使用一些随机方法)检查​​后面这些11找到第一个唯一。