工作上遇到一个数据库设计的问题,希望能在group中找到解决方案。
现在有score表,这张表用于记录所有游戏的玩家分数,每一款游戏可以有多个排行榜(category_id)。
结构如下:
score(id, category_id, player_id, score, created)
需求:
- 查询某个排行榜最近一周(7天)的排行榜列表(前n名次的玩家列表)
- 查询某个排行榜最近一个月的排行榜列表(前n名次的玩家列表)
- 查询某个排行榜全部时间的排行榜列表(前n名次的玩家列表)
- 查询指定玩家在某个排行榜中指定时间段(最近一周、最近一个月、全部时间)的排名
对于同分的情况,先提交分数的玩家排名在前。
数据库环境:
mysql ( innodb),score表有100w+的数据。目前数据量不大的情况查询速度已经不太理想。准备入手进行优化。
- 索引的话,因为几乎每个字段都会在查询条件中出现,实在不知道应该如何简历索引进行优化。
- 如果每个游戏对应一张排行榜表的话,程序上不好控制,因为游戏会越来越多。
- 如果将排行结果缓存,那么当某个玩家刚刚提交了高分,却发现自己排名没有改变,应该会觉得挺郁闷:(
针对排行这个问题,希望大家给点意见。谢谢:)
--
您收到此信息是由于您订阅了 珠三角技术沙龙(http://techparty.org) 论坛。
要在此论坛发帖,请发电子邮件到 guangzhou-...@googlegroups.com
要退订此论坛,请发邮件至
guangzhou-tech-p...@googlegroups.com
更多选项,请通过
http://groups.google.com/group/guangzhou-tech-party?hl=zh-CN 访问该论坛
分表分库,做好查询缓存
我觉得像这种报表统计的东西,每次都实时查,会很耗资源。给我做的话,我可能会以下两个方案1. 如果报表的实时性要求不是太高的话,我会提取数据放到数据仓库中,定时做统计2. 如果实时性要求比较高的话,可以将排行结果缓存。如果用户提交了高分,又想马上看到,可以把这个分数更新到相应的排行榜结果中,并且把排行版原来的最后一名的数据移除。
On Jul 28, 11:27 pm, "Nick@Simple!" <oxti...@gmail.com> wrote:
> 我觉得像这种报表统计的东西,每次都实时查,会很耗资源。
>
> 给我做的话,我可能会以下两个方案
> 1. 如果报表的实时性要求不是太高的话,我会提取数据放到数据仓库中,定时做统计
> 2.
> 如果实时性要求比较高的话,可以将排行结果缓存。如果用户提交了高分,又想马上看到,可以把这个分数更新到相应的排行榜结果中,并且把排行版原来的最后一名的数据移除。
>
1,排行榜的,维护一份缓存,每插入或更新一行记录时,计算要不要更新。2,个人的,维护一份分数结构,那个分数段多少人等等,每个人的准确排名也可实时出来。3,核心是,所有结果从缓存出而不是从数据库查。
--
web site:http://laiyonghao.com
twitter: http://twitter.com/laiyonghao
http://redis.io/commands/zrank
O(log(N))
100w+级别应能处理。
2011/7/28 Adam.Lu <qing...@gmail.com>:
2.排行榜应用,取TOP N操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted
set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
2011/7/29 王君 <gelosi...@gmail.com>: