问题表有 50w,回答表 900w,需求是查出指定用户没有回答过的问题,怎么能快一点,有大佬支个招不。

2020-12-08 11:08:59 +08:00
 hyd8323268
现在是子查询,但是如果用户回答超过 10w 并且问题表进行分页的话会更慢。需要考虑到分页和跳转指定页的实现。
7179 次点击
所在节点    MySQL
66 条回复
zpfhbyx
2020-12-09 12:30:10 +08:00
@v2Geeker 我很好奇。问题表冗余一个字段。。有啥成本。。
v2Geeker
2020-12-09 14:25:01 +08:00
@zpfhbyx 哥哥,你自己先算算嘛。我来跟你先算一个吧,你的方案,50w 的 bitmap,即每条数据会多出 0.0596M 的大小。900w 条数据,一共多出 518.55G 的数据。。。这还没算用户增长和问题增长的情况。
v2Geeker
2020-12-09 14:25:36 +08:00
@zpfhbyx 空间换时间。还是我全都要。
zpfhbyx
2020-12-09 14:38:09 +08:00
@v2Geeker bitmap 转十进制落库啊,这么算的话只会出一个 int 或者 bigint 啊,然后按位操作就行了
todd7zhang
2020-12-09 14:43:39 +08:00
@zpfhbyx 不对吧,按你 "bitmap 字段>>uid & 0 =0" 的逻辑, 一个 int32 的 bitmap,uid 取值范围[0, 31]啊?用户数几十个才
zpfhbyx
2020-12-09 14:56:49 +08:00
@v2Geeker 老哥,我错了。光想着行了。。没想列。
zpfhbyx
2020-12-09 14:57:23 +08:00
@todd7zhang 嗯, 的确是
wellsc
2020-12-09 15:00:52 +08:00
bitmap 的话要考虑数据一致性问题的,要引入中间件同步数据
JimmyChange
2020-12-09 16:55:20 +08:00
感觉所有问题 id 放内存,从问题表查出所有已回答问题 id 后求个补集就可以吧
final7genesis
2020-12-09 17:02:29 +08:00
redis 用户为 key, 问题序号 setbit 存储, 每天重新计算可行不?
mazhan465
2020-12-09 18:20:30 +08:00
先查该用户回答的问题列表,一般来说一个用户也不会回答几千几万个问题。即便真的有这么多问题,无非也就是将问题表再全表拉下来,减去已回答问题。
这样直接在程序里做减法运算,比 db 做 join 或者 exists 快多了
keepeye
2020-12-09 18:27:02 +08:00
先查出该用户回答过的问题,然后再 not in 一下?
lishen226
2020-12-09 18:45:02 +08:00
10W 条查主键应该不慢吧,关键是要多快的速度啊?
skaly
2020-12-09 18:51:10 +08:00
在问题表里面加一个字段,标识是否有用户回答,这样就行了嘛,不要考虑实时聚合的查,没有意义的
byou
2020-12-09 19:29:52 +08:00
可以换一种思路,分页显示所有问题,在当前用户回答过的问题前边做个标记,表示此问题已回答。就像 leetcode 题库那样的。
感觉没有必要只显示未回答问题,试试说服产品?
nuk
2020-12-09 20:20:34 +08:00
如果不是取全部数据的话,完全可以每个用户存分页的 index
50w 回答,假如一页 100,那么最多最多就是 5000 个 index
用户每次回答后更新 index,然后在 index 的范围内找没回答的问题
问题就是修改每页数量。。会很麻烦。。
faceRollingKB
2020-12-09 20:37:05 +08:00
50w 个问题再怎么检索都得每个人匹配 50w 次才能得出结果,量在这里我觉得快不到哪去,不如跑一个定时任务每天刷一遍数据存起来
faceRollingKB
2020-12-09 20:41:45 +08:00
每天刷有点浪费资源,就谁查给谁刷一遍做缓存吧
kinXdle
2020-12-09 23:00:06 +08:00
用户表加个标示列,回答了就更新
hyd8323268
2020-12-10 09:58:29 +08:00
@faceRollingKB 最终方案是如此

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/733228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX