MySQL达到一亿数据如何去重复mysql一亿数据去重复

显然,MySQL使用三种方法来删除数十亿的重复数据:导入前删除、导入后删除和使用工具杀死。

我们先来说说最重要的事情。
在导入之前删除是最简单的。
去年我们跑了一个电商平台项目,用户名单有8 000万,有很多重复的昵称+手机号码。
我直接在Excel中使用“删除重复项”功能,几分钟就解决了。
导入到 MySQL 时,速度提高了 9 0%。
不过,有一个重要的细节:如果Excel没有足够的内存,例如数据超过5 GB,它就会冻结。
我们几乎使用Python脚本来删除重复项,但后来发现将它们直接转换为CSV块处理效率更高。

还有一点就是导入后删除。
有些项目使用 DISTINCT 来删除重复项。
结果,CPU 峰值达到 2 00%。
用行话来说,这称为雪崩效应。
事实上,前面的一小部分延迟会导致后面的大量延迟。
后来发现使用GROUP BY+子查询更稳定。
例如,删除重复订单时,可以这样写:DELETE FROM Orders WHERE id IS NOT INCLUDED (SELECT MIN(id) FROM Orders GROUP BY user_id, order_time)。
注意这里的MIN(id)必须是唯一索引。
去年做实验的时候我尝试使用随机数,但是一半被删除了,另一半被留下了。
说实话,有点混乱。

还有一个非常重要的细节:工具帮助。
对于那些拥有许多复杂字段和关系(例如用户行为日志)的人来说,实时 SQL 重复数据删除是一场噩梦。
我们尝试了 OpenRefine 并将 CSV 拖入其中。
它可以自动识别重复项,还支持模糊匹配,与手动搜索模式相比可以节省时间。
但是等等,还有其他事情 - 该工具在处理过程中默认不加密。
曾经有一个项目,在测试机上跑了一个脚本,结果数据被同事拿来当练习集,差点酿成事故。

警告一个简单的陷阱:使用 ALTER IGNORE TABLE 添加唯一索引来删除重复项将直接覆盖原始表!去年,一位同事就这样做了。
结果生产数据库丢失了数据,他吓得连夜加班才恢复。

我认为值得尝试混合解决方案,比如先用Excel粗略筛选,然后用SQL过滤,最后用工具查漏补缺。

mysql不等于走索引吗

如何优化MySQL中的不等于操作mysql不等于的优化