单表近 7 亿条数据,现在要优化结构,进行去重,求个方案

2020-05-29 10:37:09 +08:00
 FONG2
以前设计是以请求编号为主键的,现在优化后以用户编号为主键,那么就存在大量重复数据了。
现在用 sql 查一下都得等半天,请问有啥好方法处理么
6392 次点击
所在节点    数据库
58 条回复
zouqiang
2020-05-29 15:39:49 +08:00
实现一个 Bloom Filter
saulshao
2020-05-29 15:55:32 +08:00
首先建议要分表,不然你建立的这个新表仍然没法保证查询效率。并且如果考虑数据增长,最终你也没法处理这么巨大的数据量。
joesonw
2020-05-29 16:12:13 +08:00
建个新表, 弄个队列写个处理慢慢导呗. 插数据的时候也顺手丢队列.
william2ct
2020-05-29 17:34:56 +08:00
先不说怎么去重,我就问问,是不是国资企业
FONG2
2020-05-29 17:38:13 +08:00
@william2ct 答对了 但是没有奖励
FONG2
2020-05-29 17:40:05 +08:00
@woscaizi
@saulshao
@wangyzj
@xuanbg
看 APPEND 吧
stevenkang
2020-05-29 17:44:51 +08:00
建议用 SQL 跑吧,慢点就慢点,用程序跑更慢,亲身经历。

之前一台游戏日志数据库,单表 2 亿级别,用程序跑从晚上 2 点跑到早上 8 点多。
后面改成 SQL 将查询结果直接 insert 到另外一张表,一条 SQL 语句就搞定,时间缩短到 1-2 个小时就能跑完。
ConradG
2020-05-29 17:50:49 +08:00
标准手势是拆分后归并排序
nwg
2020-05-29 18:16:12 +08:00
定时任务 批量查询--判断重复--插入新分表
fashy
2020-05-29 18:35:42 +08:00
没太明白意思,是说优化后是根据用户编号去重么?一个用户编号只保存一条记录?
假设请求编号和用户编号都是 long 类型可以表示的话,(字符串的话 hash 可能会有冲突),用两个 bitmap 怎么样?
7 亿 /1024/1024/1024/8,一个 bitmap1g 左右内存就能放下了
第一个放每行记录的用户编号,重复的忽略,不重复的把该行记录的请求编号放到第二个 bitmap 对应的位置
最终第二个 bitmap 里面被标记的 index(原表里面的主键),就可以认为是去重后的数据记录了
然后批量读取这些 index 对应的数据,直接往新表里面插
最坏的情况,请求编号和用户编号都是唯一的,去重过程也就只需要 2G 左右的内存
myCupOfTea
2020-05-29 19:54:19 +08:00
hash 分区啊
myCupOfTea
2020-05-29 19:56:13 +08:00
我之前的项目是收集几千个网站数据的,按照网站编码 hash 分了 1000 个区,反正每次查询都需要带上网站编码,飞快
分区首先要有一个指标可以用来区分数据,其次每次查询必须带上它,那你就可以用分区呢
xupefei
2020-05-30 04:55:34 +08:00
bloom filter 过一遍,疑似重复的条目存下来用哈希表检查。
cs419
2020-05-30 06:39:25 +08:00
3 、5 台机器的集群
spark 或者 flink 跑一下
估计顶多一两个小时 就搞定了
nicebird
2020-05-30 10:10:19 +08:00
后台慢慢跑喽
pabno
2020-05-30 11:37:33 +08:00
不知道去重后的数据量有多少?
如果比较少的话,可以考虑创建一张新表,根据去重规则创建唯一索引,写给程序不断的从旧表 load 数据并插入到新表中,使用 ingore insert 。
如果数据比较多的话,依然可以使用这种方式,只不过要做多一层分表
laminux29
2020-05-30 13:52:07 +08:00
看了一下楼上的回答,把问题都限定在数据库产品与对应的操作方法上了。

其实大家应该跳出这个局限性。

题主的 7 亿条数据,本质是,一堆已经限定在特定硬件,特定算法所构建的环境里的数据结构了。

因此,按照数据结构与算法的基础处理方法,得先了解硬件特性,然后再来构造处理算法。而且还要考虑目前数据已经处在环境里的数据结构的特殊性。

在题主还没有交代物理设备与具体需求之前,我觉得大家不应该急着给出解决方案。
encro
2020-05-30 15:12:18 +08:00
题目没出清楚:

“以前设计是以请求编号为主键的,现在优化后以用户编号为主键,那么就存在大量重复数据了。”

主键能重复?还是你的主键意思是主要查询条件?

感觉以前类似你 7 亿订单,用订单 ID 查询即可,现在要建立一个用户表 5000 万用户数据,根据用户 ID 查询出用户信息,然后需要用用户 ID 去查用户所有订单。如果是这样可以根据用户 ID 建立分区表或者直接根据用户 ID 或者时间分表。

或者直接采用 es,想查几个月就几个月。

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

https://tanronggui.xyz/t/676577

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

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

© 2021 V2EX