mysql百万级别数据去重,现有方法效率很低求指教

oqqNick85557692 2017-02-23 06:39:35
自己写了个淘宝商品采集,每天能采集200W以上商品数据,无奈商品id(goods_id)重复率太高。

现在想保留商品重复数据id最低的一行,其余删除。

现有去重方法:
delete from 表名 where id not in (select minid from (select min(id) as minid from qiong_goods group by goods_id) b);


数据量几万的时候还行,超过200W的时候跑了一个多钟。

请大神指教。

...全文
1006 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2017-02-25
  • 打赏
  • 举报
回复
建议分批用程序一条一条删除。
  • 打赏
  • 举报
回复
看你重复的数据量有多大,如果是一大半都是重复的,建议这样操作: 创建一个结构一样的表,然后把源表中不重复的数据,插入到这个新的表,然后把源表重命名,然后把新表改成源表名。 如果重复只是少量,建议写一个存储过程,把所有有重复的要删除的id,放到一个表里,然后开始循环遍历这个表,每次可以删除1000条数据,这么删除肯定能快不少
rucypli 2017-02-24
  • 打赏
  • 举报
回复
先用distinct出来需要保留或者要删除的id 然后通过id删除 删除完成以后 在goodid上加上唯一索引即可避免重复
zjcxc 2017-02-24
  • 打赏
  • 举报
回复
另外,你写的删除是一个事务中的操作,数据量大会导致事务开销很大,这个也会影响性能的,分批删除往往更有效率
zjcxc 2017-02-24
  • 打赏
  • 举报
回复
id 是主键么?goods_id 上有索引么?
二月十六 2017-02-24
  • 打赏
  • 举报
回复
试试这样行不,没测试,删除需谨慎
delete from 表名 where
(select COUNT(minid) from
(select min(id) as minid
from qiong_goods group by goods_id) b where minid = id)=0

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧