Php 用户等级:没有SQL怎么做?

Php 用户等级:没有SQL怎么做?,php,mysql,database,ranking,Php,Mysql,Database,Ranking,我正在开发在线游戏的服务器端部分,任务之一是计算用户等级。目前,它已经使用RDBMS完成了,但每次有玩家赢得游戏时,它都会更新每个用户行。这导致了现在的僵局,平均有20名玩家在线 我理解这种趋势——当有1000名玩家时,数据库解决方案根本不起作用 如何在Apache/PHP服务器上实时计算用户排名?是否有更智能的数据库解决方案?您可以将您的列组放入另一个表中,每次都将其截断。 已经提出(并回答)了一个类似的问题,可以在这里找到: 您可以将您的列组放入另一个表中,您每次都可以截断该表。 已经提出(

我正在开发在线游戏的服务器端部分,任务之一是计算用户等级。目前,它已经使用RDBMS完成了,但每次有玩家赢得游戏时,它都会更新每个用户行。这导致了现在的僵局,平均有20名玩家在线

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


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

您可以将您的列组放入另一个表中,每次都将其截断。 已经提出(并回答)了一个类似的问题,可以在这里找到:

您可以将您的列组放入另一个表中,您每次都可以
截断该表。
已经提出(并回答)了一个类似的问题,可以在这里找到:

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

表格用户
用户id INT PK
用户名VARCHAR
...
表2用户的分数
用户标识PK FK
分数整数指数
wins整数索引
查看v_用户_排名
选择u.user\u id、u.user\u名称、s.score、s.wins
从用户u内部加入用户
在u.user\u id=s.user\u id上
挑选*
来自v_用户_等级
按分数排序,赢得DESC
限制10
插入用户分数(用户id、分数、wins)
价值($id、$score、$wins)
在重复密钥更新时,得分=得分+$score,wins=wins+$wins

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

表格用户
用户id INT PK
用户名VARCHAR
...
表2用户的分数
用户标识PK FK
分数整数指数
wins整数索引
查看v_用户_排名
选择u.user\u id、u.user\u名称、s.score、s.wins
从用户u内部加入用户
在u.user\u id=s.user\u id上
挑选*
来自v_用户_等级
按分数排序,赢得DESC
限制10
插入用户分数(用户id、分数、wins)
价值($id、$score、$wins)
在重复密钥更新时,得分=得分+$score,wins=wins+$wins


20个用户的死锁?听起来你在使用Access。是/否?一点也不。我使用的是MySQL,但当多个用户同时访问数据库时,用户等级更新可能会重叠。我相信这会导致死锁。20个用户的死锁?听起来你在使用Access。是/否?一点也不。我使用的是MySQL,但当多个用户同时访问数据库时,用户等级更新可能会重叠。我相信这会导致死锁。很好的解决方案,谢谢。但我想知道,是否有一种解决方案根本不使用RDBMS?使用平衡的BST很容易解决这个任务,也许Apache/PHP已经准备好了这样的方法,但它现在会产生大量重复的键错误。问题是,多个用户可以同时运行排名更新,这将导致查询重叠。似乎解决方案只是将问题转化为另一个问题,但并不能解决问题。萨米奇的方法怎么样?很好的解决方案,谢谢。但我想知道,是否有一种解决方案根本不使用RDBMS?使用平衡的BST很容易解决这个任务,也许Apache/PHP已经准备好了这样的方法,但它现在会产生大量重复的键错误。问题是,多个用户可以同时运行排名更新,这将导致查询重叠。似乎解决方案只是将问题转化为另一个问题,但没有解决问题。Sammich的方法如何?问题是,我需要能够非常快速地检索用户排名(告诉用户他们的旧/新排名,并在他们赢得游戏时进行更改),并且能够显示用户评级表,而不是按排名排序,而是按其他类别排序(例如,通过字母表)。这就是为什么每次用户排名可能发生变化时,我都需要实现用户排名。您的方法包括每次用户赢得游戏时更新整个表格,然后选择以特定方式排序的X行。我的方法包括更新单行,然后以特定顺序选择X行。哪一个听起来更快?另外,在执行涉及整张桌子经常让你无法摆脱你现在正在与之斗争的桌子级僵局。我还不明白你的方式,抱歉(请你再详细说明一下。什么是分数,什么是胜利?用户排名在哪里?@user1065145
score
wins
字段将存储玩家的累积分数和胜利次数,排名将根据结果集中的行索引确定。在结果集,但在程序代码中比在查询中更容易、更灵活。当您一次只需要获取单个玩家的排名时,这是可以的。如果您同时需要所有玩家,该怎么办?问题是,我需要能够相当快地检索用户排名(告诉用户他们的旧/新排名,并在他们赢得游戏时更改)并且还能够显示用户评级表,该表不是按排名排序的,而是按其他类别排序的(例如,按字母表排序)。这就是为什么每次用户排名可能发生变化时,我都需要实现用户排名。您的方法包括每次用户赢得游戏时更新整个表格,然后选择以特定方式排序的X行。我的方法包括更新单行,然后以特定顺序选择X行。哪一个听起来更快?另外,在执行涉及整张桌子经常让你无法摆脱与之斗争的桌子级僵局