求助大表优化方案

2018-08-07 15:56:54 +08:00
 alamaya

有一张用户标签表,一个用户一个标签一条数据,现在这张表超过 2 亿了,需要做分库分表,怎么分,既能满足用用户查询标签,也能用标签查询用户,以及数据结构、整体架构上能否优化,求助各位大佬。

2829 次点击
所在节点    程序员
17 条回复
nine99
2018-08-07 16:10:28 +08:00
搞两份,一份按用户分,一份按标签分。或者看下你业务按哪个查比较多,就怎么分
alamaya
2018-08-07 16:22:11 +08:00
@nine99 主要是存在一个数据量不均衡的问题,有的标签用户很多,有的标签又没啥用户,所以还是只能按用户分,随着数据量的增长,可能还是会存在单表过大的问题。
按用户分的话,分表的张数如何考虑,而且也确实有通过标签查用户的需求,虽然场景不多,这个查询怎么做好。
或者说有没有比现有一个用户一个标签一条数据这样的数据存储方式更优化的数据结构?
owenliang
2018-08-07 16:26:28 +08:00
按用户分 mysql。

然后数据打到 ES/Mongo 中做旁路。
alamaya
2018-08-07 16:30:23 +08:00
@owenliang 能详细说一下吗,还有就是性能上 ES/mongo 能否满足?因为涉及这张表的接口访问量都非常大
owenliang
2018-08-07 16:52:03 +08:00
@alamaya 性能问题优先 redis 缓存热点,其次考虑 mysql 分表内走索引或者 mongodb 走索引,es 不适合那么高性能。
unforgiven
2018-08-07 17:03:13 +08:00
mysql 吗?表分区做了吗
alamaya
2018-08-07 17:25:24 +08:00
@owenliang 那针对少量的通过标签查用户的场景,怎么处理好?
owenliang
2018-08-07 19:17:54 +08:00
@alamaya 不是 mongo 旁路了吗,是个分布式存储
abcbuzhiming
2018-08-07 23:40:13 +08:00
@unforgiven 尽量不要做表分区,mysql 的表分区一直不太稳定,业界反应 bug 挺多的
jmone
2018-08-08 03:15:10 +08:00
@nine99 的路子是最直接有效的,定好再次分表的规则,能够做到一直水平分下去,再做上 redis 主动缓存,2 亿数据可以快到不可想象
@owenliang mongo 的性能就是 shit,过千万记录之后,加索引都救不了
sunsh2017
2018-08-08 09:02:13 +08:00
全部改用 redis, 结束。
ebingtel
2018-08-08 09:29:03 +08:00
@sunsh2017 按照 lz 的叙述,感觉数据量会一直增长,成本会不会太高啊?
ghos
2018-08-08 09:57:39 +08:00
有没有什么没那么复杂的方案哦
zhengxiaowai
2018-08-08 10:35:58 +08:00
你先搜索一下,这个问题在 V 站讨论不下十几次了
fireapp
2018-08-08 11:03:54 +08:00
hbase 有点大炮打蚊子:数据存两套
一套 userId + tag 当 rowkey,专门给用户查询 tag 用
一套 tag + userId 当 rowkey, 给 tag 查用户用
数据就是增长到 200 亿都是亚秒级查询
bapijun
2018-08-08 11:44:56 +08:00
高性能 mysql 上面有一整章说这件事情怎么办,你可以看看,我记得知乎以前也有说过,主要是垂直拆分和水平拆分两种
sunsh2017
2018-08-09 08:02:58 +08:00
@ebingtel 不高 用 redis 是最好的方案 用 set 即可 用户数不过百万 标签也不过百万 其实很省的 嫌费内存 你用 ssdb 好了

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

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

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

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

© 2021 V2EX