让我们定义一个相当抽象的游戏,概述我的问题。在这个游戏中有玩家,标志和团队。假设有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 的团队现在时才会感到速度快,那么它是否有助于删除旧条目(标志已被删除)下降)?也许我会把它们放在一个旧的数据库中,以便人们可以对以前的团队进行较少的查询。
我关心重负荷下的响应速度。所以这里的任何指针也会受到赞赏。
答案 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上创建非聚集索引。