mysql 千万级表如何相互排重复?

2020-03-14 03:12:16 +08:00
 Sumzibuyu

数据库 A 有 1000w 数据

数据库 B 有 200W 数据,AB 数据库结构一样,都存在字段 C

本地测试环境,mysql8,16G 内存,就我一个用户

请问,如何优化,才能快速在 A 表中标记 AB 两表中 C 字段重复的数据

我测试了下,运行时间太长,需要优化,麻烦懂的大佬指点下啊

1713 次点击
所在节点    问与答
12 条回复
Sumzibuyu
2020-03-14 03:15:20 +08:00
只需要这一次整理完就行 ,并非正式环境也需要这样
D0n9
2020-03-14 03:15:23 +08:00
发一下你的方法呀
运行时间太长主要瓶颈在哪。。cpu ? 内存?
Mohanson
2020-03-14 03:23:15 +08:00
布隆过滤器,O(N), 不存在比它还快的算法了。以前都是 64m 内存玩的,16g 能给你做到 9 个 9.
luckyrayyy
2020-03-14 03:25:17 +08:00
大数据去重➕允许有错误,考虑布隆过滤器
sujin190
2020-03-14 09:48:03 +08:00
如果一次性的话,直接小表读出来存到 dict 里,大表顺序读判断就是了啊,16g 内存绰绰有余了,才一千万,又不是一千亿,不用想那么多吧

需要重复做的话,这是结构设计问题,应该在源头来解决吧
micean
2020-03-14 09:49:21 +08:00
字段 c 有索引吧,先试试简单的,每次从 a 表读 50 万数据,去和 b 表比较,然后把结果保存。别想着一次性干完。
wanguorui123
2020-03-14 11:10:45 +08:00
Redis 哈希去重复
Sumzibuyu
2020-03-14 15:31:09 +08:00
我对数据库不太懂,也是一次性任务,就想把这一次过去,目前我感觉 mysqld 的内存占用只有 200M+ cpu 20%
Sumzibuyu
2020-03-14 15:31:46 +08:00
@Sumzibuyu 使用的语句也就是 update set in 很慢 很慢
Sumzibuyu
2020-03-14 15:50:21 +08:00
mysql8 MyISAM
sujin190
2020-03-14 16:16:03 +08:00
@Sumzibuyu #9 如果重复很多,估计还不如重新插入到个新表,然后删掉老表改表名称来的更快的吧,或许你可以生成好 sql,然后用数据导入 loaddata 试试看或许会快一点
Sumzibuyu
2020-03-14 16:42:37 +08:00
@sujin190 我需要标记出重复的

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

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

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

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

© 2021 V2EX