按触发器排序排名

时间:2019-03-02 22:43:53

标签: mysql sql sorting ranking leaderboard

我创建了一个游戏,玩家可以在其中获得等级。基本信息在表格“ 字符”中(昵称,lvl,exp,金钱...)。

我想进行一个排名,该排名会定期更新并实时运行。我认为每当有人在网站上输入“排名”标签时,在“ char”表上执行“ ORDER BY lvl”操作都是没有意义的。

我的计划是这样的:

1)新建一个表:“ 排名”,对数据进行物理排序。

2)创建一个触发器,该更新将在有人达到新级别或有人创建新角色时更新排名。它有意义并且更有效吗?

如果是,该怎么办?如果没有,怎么办呢?

1 个答案:

答案 0 :(得分:1)

为什么每次有人访问“排名”页面时都不想执行“ ORDER BY char.lvl”?通常,这就是在关系数据库中执行此类操作的方式。

去标准化(出于性能原因复制数据/索引的行为)确实是您的建议。将相关数据复制到“排名”表中是可以的,但会占用更多空间。

现在,去规范化或使用触发器没有内在的错误,但是我看不出增加这种复杂性的真正原因(但您会更好地知道-您是否尝试过这种方法,并且性能低于预期?)

您可以在lvl列上创建索引,这将使查询的排序速度更快。 (有关索引的更多信息,请参见https://dev.mysql.com/doc/refman/8.0/en/create-index.html)。这样的更新二级索引比重新构建“排名”表更快,并且占用的内存/处理器也更少。

如果附加索引证明不足,那么触发器+附加表可能会很好地锻炼...

通过“按物理方式排序”,我想您的意思是拥有主键(相对于辅助索引)。但是这个钥匙包括什么呢?也许是lvl +昵称?如果是这样的话,我仍然倾向于lvl + nickname上的索引。

而且,这引起了一些其他问题...用户可以更改其昵称吗?新的水平还会增加他们的经验吗?