gpt4 book ai didi

sql - oracle 中的排行榜设计和性能

转载 作者:行者123 更新时间:2023-12-05 00:38:14 25 4
gpt4 key购买 nike

我正在开发一款游戏,我正在使用排行榜来跟踪玩家的得分。还需要跟踪大约 200 个额外的统计数据。这些统计数据包括:击杀、死亡、游戏时间、使用的武器、获得的成就等等。

玩家感兴趣的是得分、击杀数、死亡数和比赛时间。所有其他统计数据不一定需要在游戏中显示,但如果我想查看它们或将它们与其他玩家进行比较,应该可以访问。预计要存储在此排行榜表中的玩家数量约为 200 万。

目前的设计是将玩家 ID 存储在一个表中,例如:
player_id , points , stat_1 .. stat_200 , date_created , date_updated
如果我想根据积分显示排序的排行榜,那么我必须在积分上放置一个索引,并使用选择查询对其进行排序,并将结果限制为每次返回 50。还有一些想法可以让玩家根据其他几个统计数据(例如最多可排序的 5 个统计数据)对排行榜进行排序,例如上场时间或死亡人数。

预计同时玩游戏的用户数量约为40k。也许有四分之一,但这真的是一个大概的数字,会主动浏览排行榜,其余的只会玩游戏并在完成后上传他们的分数。

我对以下这种方法有很多疑问:

  • 似乎,但我有我的怀疑,共识是具有数百万条记录的排行榜应该可以根据几个统计数据进行排序在 RDBMS 中不能很好地扩展。这样对吗 ?
  • 是否通过选择查询对排行榜进行排序,假设我们有一个索引,会非常慢,如果是这样,我该如何解决这个问题?
  • 我应该将不会在单独表中排序的附加统计信息的存储分开还是有另一种更好的方法?
  • 是否需要将排序结果缓存在内存或单独的表中,记住预期的负载,如果是这样,我应该考虑哪些解决方案或选项?

  • 如果我的方法完全错误,我最好以另一种方式做这样的事情,请告诉我,即使像云托管环境中的 NoSQL 解决方案这样的选项也可以考虑。

    干杯

    最佳答案

    1) 对于多个索引,更新表的成本会更高。这一切都归结为每个玩家状态写入数据库的频率。

    2)只要索引足够小以适合RAM,它就会非常快。在那之后,性能受到了很大的打击。

    3) 有时,如果将所需的所有字段添加到索引中,则可以获得性能,因为 DBMS 根本不需要访问该表。如果访问的字段与行的大小相比较小,则此方法最有可能起作用。

    4) Oracle 可能会擅长为你做缓存,但如果你有大量用户都在做相同的查询,那么定期运行该查询并将结果存储在内存中(或内存映射文件)可能会更好)。
    例如,如果高分列表被访问 50 次/秒,您可以通过每 2 秒转储一次该问题来减少 99% 的负载。
    我对此的建议是:除非你需要,否则不要这样做。先测量性能,必要时再添加。

    关于sql - oracle 中的排行榜设计和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831670/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com