【问题标题】:Sorting ranking by trigger按触发器排序排名
【发布时间】:2019-07-24 14:47:15
【问题描述】:

我创建了一个游戏,玩家可以在其中获得关卡。基本信息在“char”表中(昵称、lvl、exp、money ...)。

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

我的计划是这样的:

1) 制作一个额外的表格:“ranking”,数据将在其中进行物理排序。

2) 创建一个触发器,每当有人达到新级别或有人创建新角色时,都会更新排名。它是否有意义并且更有效?

如果是这样,我该怎么做?如果没有,还有什么办法呢?

【问题讨论】:

    标签: mysql sql sorting ranking leaderboard


    【解决方案1】:

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

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

    现在,反规范化或使用触发器本质上没有任何问题,但我认为没有真正的理由增加这种复杂性(但您会知道更多 - 您是否尝试过此操作并且性能低于预期?) .

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

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

    通过“物理排序”,我认为您的意思是有一个主键(相对于二级索引)。但是这个密钥包括什么?也许是lvl +昵称?如果是这样的话,我仍然倾向于 lvl+nickname 的索引。

    而且,这引出了一些额外的问题......用户可以更改他们的昵称吗?一个新的关卡也会增加他们的经验吗?

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多