MySQL删除重复记录的方案?

toil 发布于 2013/04/29 12:58
阅读 818
收藏 5

这么久了,话说第一次提问。

怎么样才能更快的删除重复数据,以下我是已经采取过的方案。


5W多条记录  删除重复记录,保留ID最小的行。


delete from table
	where peopleId in 
		(select peopleId from table group by peopleId having count(peopleId) > 1)   
	and id not in 
		(select min(id) from table group by peopleId having count(peopleId)>1)

出错:

MariaDB>1093 - You can't specify target table 'table' for update in FROM clause

google>mysql 一个较特殊的问题:You can't specify target table 'wms_cabinet_form' for update in FROM clause - 老湖 - 博客园

不能先select出同一表中的某些值,再update这个表(在同一语句中),

于是,使用子集。

delete from table
	where peopleId in 
		(select peopleId from (select tmp.* from table tmp) a group by peopleId having count(a.peopleId) > 1)   
	and id not in 
		(select min(id) from (select tmp.* from table tmp) b group by peopleId having count(b.peopleId)>1)


运行几十秒后都没结果,没等结果出来,开始优化

子集只需要需要的列

delete from table
	where peopleId in 
		(select peopleId from (select tmp.id, from table tmp) a group by peopleId having count(a.peopleId) > 1)   
	and id not in 
		(select min(id) from (select tmp.id,tmp.peopleId from table tmp) b group by peopleId having count(b.peopleId)>1)


30分钟无结果

再次google>mysql表删除重复记录方法总结及效率对比

总结:  第一种方法历史22分钟,系统负载5左右; 第二种方法效率非常低下,把未知索引文件破坏,终止执行 第三种方法历时17分钟,其中 insertinto tmp_ids selectmin(id),name from test groupby name havingcount(*)>1orderbynull 历时15分钟,删除动作历时2分钟,系统负载3左右 第四种方法,执行过程中,把它test的索引文件都破坏了,可见“威力”之大;


好像都比较慢,于是我惆怅了。。

当初没设该列为unique就是个错误。。。。

以下是问题补充:

@toil:没人回答? oh no, 只是想找一个更快的方法而已。 (2013/04/29 14:06)
加载中
0
优雅先生
优雅先生

我练习过一个类似的例子。直接说下几步关键的,你可以用这种方法对你的数据试验下(根据people表的pid判重,保留多条重复记录中pid最小的记录):

A、创建临时表存储有重复的记录的pid

CREATE TEMPORARY TABLE SELECT pid FROM people GROUP BY pid HAVING COUNT(pid) > 1;

B、创建一个临时表存储重复列组中值_rowid最小的列的_rowid:

CREATE TEMPORARY TABLE t2 SELECT MIN(_rowid) AS rowid FROM people GROUP BY pid HAVING COUNT(pid) > 1;

C、删除重复记录

DELETE FROM people WHERE pid IN (SELECT pid FROM t1) AND _rowid NOT IN (SELECT rowid FROM t2);



toil
toil
很强大啊,秒出结果,之前复制子集太慢了。2了
0
优雅先生
优雅先生
A、B两步或许可以合成一步,只创建一个临时表,至于快不快,你自己试验下
0
maiyang
maiyang
mysql没有rownumber over分析函数?
0
mark35
mark35
常规办法在mysql这坨屎上是不管用的!
返回顶部
顶部