论坛首页 Java企业应用论坛

迅雷的一个面试题

浏览 58898 次
精华帖 (8) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2012-02-29  
有1kw用户..并不代表有1kw分...

用说不了???
0 请登录后投票
   发表时间:2012-02-29  
jiuyuehe 写道
Kisses99 写道
我觉得ls回答的有问题,lz问题也有歧义。到底这个id, score里的id是不是用户id?还是只是一个pk?
如果说题目实质上是求在这个表结构下,已知score,求score的排名,那么
select count(1) from table where score<=score#
不就完了么?score是有index的,这样的操作用的了几秒钟?
楼上说什么分区,对于这种显然是要跨分区查询的sql,并没有什么特别的好处。

求喷。

是用户id ,我试了下,600w要28s。蛮满的


score加索引
0 请登录后投票
   发表时间:2012-02-29  
inotseeyou 写道
这样怎么样?
存储部分排名信息,第1,1*n,2*n,3*n,...的排名信息(分数)
1亿用户平均抽取n = 1亿/(k=10000) = 10000
即内存中存储了平均分布在排名中的10000个用户的排名信息(定时同步内存与数据的对应排名用户信息)

通过二分差找确认用户所属分区,
读取分区内容,再通过二分查找获得具体排名



(定时同步内存与数据的对应排名用户信息)

上亿数据排名同步的方案是什么?
0 请登录后投票
   发表时间:2012-02-29  
上述直接用sql实现的方案就别想了。

这个功能不可能是实时的。
只能是相对实时,基本上就是2楼的方案。

关键是同步方案
0 请登录后投票
   发表时间:2012-02-29  
hardPass 写道
tsxm 写道
hardPass 写道
就一定要用数据表来完成么?
CPU,内存,外存
同学们啊!

桶排序呗,
直接在程序中搞个数组,数组的下标就是分数,元素是每个分数对应的人数。

具体的,如果不需要精确计算,为了减少同步及遍历计算的性能损失,可以为每个数组元素设定一个预留值。







都说内存不够了,用外存估计速度太慢



1G内存还不够?如果现在排名第一的是1亿分,也就是一个长度为1亿的数组而已
300MB左右就够了,剩下的内存还可以再维护个计数缓存的数组(每个元素是上面数组希格玛,0到i),数组长度是上面数组一样


这个方案不错。
数据库存储时,需要分库。
更新数据库时,同时更新内存数组。
同样内存中的数组,也可以分到不同的机器上,比如1-10000分数的在机器1上,10001-20000的在机器2上,同分库分表原理。

这样性能极佳,方案简单,可用性也有保障。
0 请登录后投票
   发表时间:2012-02-29  
是根据用户ID查找用户名次,关键是找出用户所在行
0 请登录后投票
   发表时间:2012-02-29   最后修改:2012-02-29
2亿数据库表字段:ID,分数,用户ID
select count(ID) from  tableName  where  分数>当前用户分数

至于什么分区索引 那时数据库设计者考虑的东西  你只需要快速简练的查询该排名即可,这样会很慢么??????????

0 请登录后投票
   发表时间:2012-02-29  
boreas_baosj 写道
2亿数据库表字段:ID,分数,用户ID
select count(ID) from  tableName  where  分数>当前用户分数

至于什么分区索引 那时数据库设计者考虑的东西  你只需要快速简练的查询该排名即可,这样会很慢么??????????


count 计数其实是很慢的,数据库的IO压力很大。
0 请登录后投票
   发表时间:2012-02-29  
raychl 写道
boreas_baosj 写道
2亿数据库表字段:ID,分数,用户ID
select count(ID) from  tableName  where  分数>当前用户分数

至于什么分区索引 那时数据库设计者考虑的东西  你只需要快速简练的查询该排名即可,这样会很慢么??????????


count 计数其实是很慢的,数据库的IO压力很大。

走索引和不走索引差别就大了
0 请登录后投票
   发表时间:2012-02-29  
freish 写道
raychl 写道
boreas_baosj 写道
2亿数据库表字段:ID,分数,用户ID
select count(ID) from  tableName  where  分数>当前用户分数

至于什么分区索引 那时数据库设计者考虑的东西  你只需要快速简练的查询该排名即可,这样会很慢么??????????


count 计数其实是很慢的,数据库的IO压力很大。

走索引和不走索引差别就大了

用户的访问量太大了,该索引将会成为热区,也够呛的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics