makdon
2020-12-08 21:33:36 +08:00
用布隆过滤器应该可以搞得比较快。
新增一个用户-布隆的 bitmap 表,主键用户 id,另一列一个大 bitmap
然后
select *
from 问题表
where
!( 取布隆 bit 结果(问题 id) & 用户 bitmap)
# 假定 id 连续单调递增
order by 问题 id
offset 页数*页大小
没有具体 benchmark,不过我想这大概能用,线性遍历问题表够了就可以返回的算法
不过其实算一下,9,000,000 条问题,一条算 1KB,内存占用也就 9GB 这个数量级,如果业务允许(例如增删改不不频繁),我会搞两台内存大的服务器,直接在内存里面玩上面的解法;
如果“用户回答超过 10w”指的是一个用户的话,那就改成随机从问题库里面挑然后位与康康有没有回答过,分页按钮改成“换一批问题”(不然每次都要遍历 10w 个问题)
一定要分页的话,可以给用户记录一个“上一次回答的最后一个问题的 id”,下次找的时候从那个 id 开始找。