本人写了个淘宝商品采集,每天能采集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的时候跑了一个多钟。
请高手指点。
现在想保留商品重复数据id最低的一行,其余删除。
现有去重方法:
delete from 表名 where id not in (select minid from (select min(id) as minid from qiong_goods group by goods_id) b);
数据量几万的时候还行,超过200W的时候跑了一个多钟。
请高手指点。
解决方案
100
20
试试这样行不,没测试,删除需谨慎
delete from 表名 where
(select COUNT(minid) from
(select min(id) as minid
from qiong_goods group by goods_id) b where minid = id)=0
delete from 表名 where
(select COUNT(minid) from
(select min(id) as minid
from qiong_goods group by goods_id) b where minid = id)=0
20
另外,你写的删除是一个事务中的操作,数据量大会导致事务开销很大,这个也会影响性能的,分批删除往往更有效率
20
看你重复的数据量有多大,假如是一大半都是重复的,建议这样操作:
创建一个结构一样的表,然后把源表中不重复的数据,插入到这个新的表,然后把源表重命名,然后把新表改成源表名。
假如重复只是少量,建议写一个存储过程,把全部有重复的要删除的id,放到一个表里,然后开始循环遍历这个表,每次可以删除1000条数据,这么删除肯定能快不少
创建一个结构一样的表,然后把源表中不重复的数据,插入到这个新的表,然后把源表重命名,然后把新表改成源表名。
假如重复只是少量,建议写一个存储过程,把全部有重复的要删除的id,放到一个表里,然后开始循环遍历这个表,每次可以删除1000条数据,这么删除肯定能快不少