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

2020-12-08 11:08:59 +08:00
 hyd8323268
现在是子查询,但是如果用户回答超过 10w 并且问题表进行分页的话会更慢。需要考虑到分页和跳转指定页的实现。
7139 次点击
所在节点    MySQL
66 条回复
zjttfs
2020-12-08 11:26:04 +08:00
问题表加统计 回答数, 回答数做索引 如何?
zpfhbyx
2020-12-08 11:28:50 +08:00
问题表冗余一个字段 用 bitmap 的方式标记回答的用户,查询的时候 字段>>uid & 0 =0(应该是这样) 标记为未回答,后面的就好搞了
hyd8323268
2020-12-08 11:35:30 +08:00
@zjttfs 需求是查询出该顾问未回答过的问题,而不是未被人回答过的问题哦 orz
xuanbg
2020-12-08 11:44:33 +08:00
select q.* from question q left join answer a on a. question_id = q.id where a.id is null;
xuanbg
2020-12-08 11:49:21 +08:00
具体到顾问,on 后面加上 and a. adviser_id = 顾问 id 就行
taogen
2020-12-08 11:49:23 +08:00
表结构,查询 SQL 和 explain 贴一下。
xuanbg
2020-12-08 11:50:56 +08:00
你这个需求无法优化数据结构,肯定快不起来的……
aeli
2020-12-08 11:53:51 +08:00
@zpfhbyx 这个 bitmap 就行了,不过最好放到 redis 里面
zpfhbyx
2020-12-08 11:59:39 +08:00
@aeli 放 redis 做检索分页不好搞吧
treblex
2020-12-08 12:45:07 +08:00
给问题按难度 类型 分级,像多邻国那种形式会不会好一点,
必须查出用户没有答过的问题 感觉不是个强需求,就算随机也不见得用户会发现
whileFalse
2020-12-08 13:44:32 +08:00
把问题 ID 先缓存到内存里。然后查该用户的所有回答即可。
opengps
2020-12-08 13:51:59 +08:00
问题表下增加统计字段,小批量分时段维护
laminux29
2020-12-08 13:56:52 +08:00
你就缺那点硬盘空间嘛?这题显然是空间换时间的思路啊,给每个用户建个 2 分表,分别存储已回答与未回答的不就完事了。
Nillouise
2020-12-08 14:01:41 +08:00
每个用户储存回答过的问题,查询的时候在应用里跟全部问题过滤一下即可。
sunziren
2020-12-08 14:03:52 +08:00
先整一个 2TB 的内存,然后数据库放到内存里
sunziren
2020-12-08 14:04:50 +08:00
然后双路 CPU+集群,然后咱们再进一步探讨
I52Hertz
2020-12-08 16:11:20 +08:00
先查出已回答的问题,然后从全集里去掉
pkupyx
2020-12-08 16:30:29 +08:00
详细描述需求场景吧,都打了什么标签,推荐没做过的的题目应该也不是 50W 道题里面没做过的随机推吧。
vance123
2020-12-08 17:20:30 +08:00
转化成算法题的话就是:
对于序列 s = 00001010101..., 已知所有`1`的下标, 求第 k 个`0`的下标大小
解法应该是 O(1)吧, 当然问题 ID 要连续
stevenbipt
2020-12-08 17:39:41 +08:00
sql 的话像 4 楼那样直接一个 left join 就能出来

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

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

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

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

© 2021 V2EX