用户排名:如何做到没有SQL


User ranks: how to do it without SQL?

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

我理解这种趋势-当有1000名球员的数据库解决方案将根本不起作用。

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

您可以将您的排名放在另一个表中,每次您都要TRUNCATE。一个类似的问题已经被问到(并得到了回答),可以在这里找到:在不杀死服务器的情况下更新用户排名的最佳方法

为什么要将排名存储在单独的表中呢?存储分数并根据需要查询排名,或者甚至创建一个视图。你只需要更新与单个用户相关的数据,而不是更新整个表,如果你使用的是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