mysql - 游戏排行榜的数据库方法

标签 mysql database

我正在开发一个服务器应用程序,它有多个游戏并且应该能够处理数百万玩家。每个游戏都需要一个排行榜,必须能够显示玩家的当前位置和前 10 名玩家,以及玩家好友的位置。

目前我正在使用两个表。

用户评分

  • 编号
  • 用户编号
  • 游戏编号
  • 得分
  • 创建于

user_max_score

  • 编号
  • 用户编号
  • 游戏编号
  • 最高分
  • 创建于
  • 更新时间

每当用户第一次玩任何游戏时,数据都会插入到第一个和第二个表中。如果用户第二次玩并且得分高于他们之前的得分,我们将数据插入 user_score 表并使用新的 max_score 更新 user_max_score 表。

为了获得用户的排名,我像这样触发查询。

SET @i=0;
SELECT id, user_id, max_score, @i:=@i+1 AS rank 
FROM user_max_score WHERE game_id = $gameId
ORDER BY max_score DESC, updated_at ASC;

还有比这更好的方法吗?

最佳答案

我使用的一种方法是单表概念。发布所有分数,然后您可以将后台的分数合并到汇总表中。这样可以保持前端性能,您可以将汇总信息的后台合并过程处理到累积分数的缓存表中,在我的情况下,我使用的是 goLang 和 couchbase 表,但是在 mySql 中,您会发现添加一行要多比 upsert 快,你可以在 upsert 中找到记录然后更新。由于大小和可伸缩性,当前的数据库模式正在迅速转变为 noSQL 格式,旧的 SQL 模式在性能和复制方面的斗争变得复杂,对于单个数据库系统和小用户群,你没问题。

请求地址

HTTP POST   http://[some dns]:8080/v1/post_score

请求负载

{       
    'user_id'  :    '[some-user-id]', 
    'game_id'  :    '[some-game-id]',
    'score'    :    [value],
    'duration' :    [time played],
    'level'    :    [level reached],
    'stars'    :    [stars gained],
    'os'       :    '[os identified]'
} 

数据库中的附加字段,由用户代理捕获。

'ip' : [detected user ip],
'ts" : [timestamp from the server point of view] 

关于mysql - 游戏排行榜的数据库方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37274066/

相关文章:

java - 从程序中的objectdb数据库中检索值

sql - MySQL 统计匹配单词数

mysql - 在 MySQL 中更新 400 万条记录时如何调整此查询?

java - 打印 Java 中的值

sql - Scala 元组问题

c# - 我收到错误 : Additional information: Object reference not set to an instance of an object

mysql - 我应该为此查询使用 MySQL 过程吗?

Java MySQL JDBC 通信链路失败

mysql - 获取每组分组 SQL 结果中最大值的记录

mysql - AVG 限制为每组最后 3 个值