用户排名:没有SQL怎么做?

时间:2013-01-16 15:22:36

标签: php mysql database ranking

我正在开发在线游戏的服务器端部分,其中一项任务是计算用户排名。目前它使用RDBMS完成,但每当某个玩家赢得游戏时它会更新每个用户行。现在,当平均有20名玩家在线时,会导致死锁。

我理解这种趋势 - 当有1000名玩家时,数据库解决方案根本不起作用。

如何在Apache / PHP服务器上实时计算用户排名?它有更智能的数据库解决方案吗?

2 个答案:

答案 0 :(得分:2)

您可以将自己的排名放在另一个表格中,每次TRUNCATE。 类似的问题已经被提出(并回答),可以在这里找到: Best way to update user rankings without killing the server

答案 1 :(得分:1)

为什么要将排名存储在单独的表中?根据需要存储分数并查询排名,甚至创建视图。您只需更新与单个用户相关的数据,而不是更新整个表,如果您正在使用InnoDB表,则UPDATE查询将使用行级锁定,而不是使用myISAM获得的表级锁定。

TABLE users
  user_id INT PK
  user_name VARCHAR
  ...

TABLE user_scores
  user_id PK FK
  score INT INDEX
  wins INT INDEX

VIEW v_user_ranks
  SELECT u.user_id, u.user_name, s.score, s.wins
  FROM users u INNER JOIN user_scores s
    ON u.user_id = s.user_id

SELECT *
FROM v_user_ranks
ORDER BY score, wins DESC
LIMIT 10

INSERT INTO user_scores (user_id, score, wins)
  VALUES ($id, $score, $wins)
  ON DUPLICATE KEY UPDATE score=score+$score, wins=wins+$wins