mysql 删除表中的重复记录
[ 2009/07/31 20:53 | by selboo ]
MySQL中漏掉了40%左右的数据,寻找这个错误的代价是花了三天,将所有的代码重新检查了一遍,由于代码不是我写的,看得晕头转向,上苍保佑,我还不算太笨,最终找到了原因,不过接着就碰到另外一个问题,找回的数据中存在重复,而且在无法在重复的健上建立唯一,于是我想了一个最笨的方法
SELECT * FROM sub_new WHERE email IN (
SELECT email FROM sub_new
GROUP BY email HAVING count(email) > 1
)
SELECT email FROM sub_new
GROUP BY email HAVING count(email) > 1
)
这种算法是最傻也是最没出息的算法,在数量在1W的时候还可以接受,到10W就要两分钟了,到50W就死在那里了,所以告诫那些跟我一样天资不算聪明的人,数据量比较大的时候千万别用这种方法,这种类似冒泡排序的算法复杂度是O(n^2),如果你有10W条记录,你自己乘一下吧
接着又想了另外一个方法,虽然机械了点,不过效率非常之高,分三步走:
CREATE TABLE tmp AS SELECT * FROM youtable
GROUP BY name
DROP TABLE youtable
ALTER TABLE tmp RENAME youtable
GROUP BY name
DROP TABLE youtable
ALTER TABLE tmp RENAME youtable
10W条记录,在第一步处理师大约为4秒,50w条记录时为19秒左右,再往上就没测了
后面两条语句纯粹是体力活,如果你用的是phpadmin,点点鼠标就可以搞定