我创造了一个玩家将获得等级的游戏。基本信息在表“char”(昵称,lvl,exp,money ......)中。
我想做一个定期更新并实时工作的排名。我认为每当有人进入网站上的“排名”标签时,在“char”表上执行“ORDER BY lvl”操作是没有意义的。
我的计划是这样的:
1)创建一个附加表:“排名”,其中数据将被物理排序。
2)创建一个触发器,每当有人达到新级别或某人创建新角色时,该触发器将更新排名。它是否有意义并且更有效率?
如果是这样,我该怎么办?如果没有,怎么办呢?
每当有人访问“排名”页面时,你为什么不想做'ORDER BY char.lvl'?这通常是在关系数据库中执行此类操作的方式。
去标准化(出于性能原因而复制数据/索引的行为)正是您所建议的。复制“排名”表中的相关数据会起作用,但消费者会有更多空间。
现在,去标准化或使用触发器没有任何本质上的错误,但我没有看到增加这种复杂性的真正原因(但你知道的更好 - 你是否尝试过这种情况并且性能低于预期?)。
您可以在lvl列上创建索引,这将使查询更快地进行排序。 (有关索引的更多信息,请参阅https://dev.mysql.com/doc/refman/8.0/en/create-index.html)。像这样更新二级索引会更快,并且比重建“排名”表更少的内存/处理器密集。
如果证明附加指数不足,那么触发器+附加表可以很好地锻炼......
通过“物理排序”,我认为你的意思是拥有一个主键(而不是二级索引)。但这个关键包括什么?也许lvl +昵称?如果是这样的话,我仍然倾向于lvl +昵称的索引。
并且,这引出了一些额外的问题......用户可以更改他们的昵称吗?新的水平会增加他们的经验吗?