eg:表1有50w+条数据;在这50W+数据中找出其中重复的数据。重复数据的条件是:表1中的字段1、字段2、字段3、字段4的值与其他数据的这几个字段值相等(其中表1中有20+字段),请问有什么合适的方案从这50W条数据中筛选出重复的数据(重复数据大概有5000条)
首先对于这种大规模数据,不太好一个个比较找出重复数据,不仅时间长,数据库也会进行大量的io操作,还有可能造成内存泄漏。目前对于这种场景我是总结了两种方法,如有更好的方法也欢迎一起讨论。
一、可以考虑使用 10个 Job,每个 Job 固定一个 ID 范围,扫描出数据。每个 Job 5万的数据量,很快就可以扫出来,而且你可以只到必要的字段。之后用扫描发送MQ,再接收 MQ 消息,查询字段的值是否存在。因为有Job、MQ 了,你可以适当控制扫描和消费速度。
举个例子来说:
-
Job 扫描数据:
- 任务:每个 Job 扫描表中的一部分数据(例如,扫描 5 万条记录)。
- 提取信息:从每条记录中提取出字段1、字段2、字段3 和字段4 的值,并将这些值打包成消息。
-
将数据放入 MQ:
- 消息内容:每个 Job 将提取的信息(例如,字段1、字段2、字段3 和字段4 的组合)作为消息放入 MQ 中。消息可以是 JSON 格式的字符串,包含这些字段的值。
-
MQ 中的数据:
- 队列:MQ 中的每条消息都包含一个记录的字段值组合。这些消息在 MQ 的队列中等待被消费者处理。
- 存储方式:MQ 会将这些消息持久化到磁盘,以便在系统崩溃或重启后能够恢复数据。
-
消费者处理消息:
- 任务:消费者从 MQ 中读取消息,检查这些字段值组合是否已经存在。消费者可以是一个或多个处理这些消息的进程。
- 重复检查:消费者可能会将字段值组合存储在一个临时的数据结构(如哈希表)中,以快速判断这些字段组合是否重复。如果发现重复,记录相关信息进行后续处理。
二、对重复的数据判定条件进行冗余一个hash字段,然后拿这个字段判断比较是否有相同的
举个例子来说:
- 增加一个hash字段:你可以增加一个额外的字段,比如
hash_code
,来存储字段1
、字段2
、字段3
、字段4
组合的hash值。 - 计算hash值:对于每一行数据,你将
字段1
到字段4
的值拼接在一起,然后计算一个hash值。例如,你可以使用MD5或SHA等hash算法。
例如:
-
- 第1行:
A-B-C-D
-> 计算出一个hash值hash_1
。 - 第2行:
X-Y-Z-W
-> 计算出一个hash值hash_2
。 - 第3行:
A-B-C-D
-> 计算出和第1行相同的hash值hash_1
。 - 第4行:
A-B-X-D
-> 计算出一个新的hash值hash_3
。
- 第1行:
- 通过hash值筛选重复数据:你可以根据
hash_code
来判断哪些数据是重复的。如果两行数据的hash_code
相同,就可能是重复数据。例如,ID为1和ID为3的hash_code
都是hash_1
,这意味着它们可能是重复的。接下来可以对它们的原始字段进行进一步比对,确保它们确实重复。