数据库设计:针对我的特定问题在重负载下快速访问

时间:2010-12-07 14:15:45

标签: mysql sql database-design

让我们定义一个相当抽象的游戏,概述我的问题。在这个游戏中有玩家标志团队。假设有1,000,000个玩家和500,000个不同的类型标志。每个玩家围绕收集旗帜移动,他们一次可以容纳多达20个旗帜。然而,玩家通常会丢弃旗帜,偶尔会有玩家偷走旗帜。每个玩家的目标是形成可能的最大团队,其中玩家 X 队友被定义为至少具有与玩家共同的一种旗帜类型的任何人< EM> X

在我的数据库中,我将播放器和标志类型存储为UUID。我将记录为在数据库中使用日期时间条目拾取和删除标记。这样我的数据库模式就可以这么简单:

table: GameState
row1: entryId (key)
row2: player (UUID)
row3: flagType (UUID)
row4: findTime (datetime)
row5: dropTime (datetime)

鉴于玩家 X ,我需要在日期时间 t X 团队中所有玩家所需的查询>?

如果我担心只有在确定谁在 X 的团队现在时才会感到速度快,那么它是否有助于删除旧条目(标志已被删除)下降)?也许我会把它们放在一个旧的数据库中,以便人们可以对以前的团队进行较少的查询。

我关心重负荷下的响应速度。所以这里的任何指针也会受到赞赏。

1 个答案:

答案 0 :(得分:0)

使用UUID(3×10 ^ 38)会因IO开销而终止响应时间。如果你使用MS SQL Server int类型,那么正值为2,147,483,647,负值范围内为正数。

索引也将确定查询响应时间。按标志值的索引将产生谁具有X标志的快速结果。删除已删除的标志将减少查询所涉及的IO。

所有至少在旗帜上共享的玩家是:

Select player from GameState where FlagType IN
(Select FlagType from GameState where Player = 'PlayerValue')

为了使上述查询最快,表格应该在Player上有一个聚集索引。在FlagType上创建非聚集索引。