日期:2014-05-16  浏览次数:20859 次

[求助] 千万级的表怎么去重复?
一直都是在折腾万级别的小小数据库,不知道索引、数据类型等的不同会对效率有多大影响。最近不是密码 泄露吗?就下了个,导入mysql数据库,共两千多万条记录,只留密码字段,其他字段全部删除,进行select、insert等测试,有了索引select的效率明显不同,但在去重复时遇到难题。

方法一:
CREATE TABLE newtable SELECT DISTINCT pwd FROM oldtable
这种方式看起来效率最高,但运行时直接把机器拖死,内存一会儿就用完了。

方法二:
逐条获取再删除重复(每次提取$num条记录,我的$num=50)
  $result = mysql_query("SELECT MIN(id), pwd FROM tablename WHERE id BETWEEN $id AND $num GROUP BY pwd");
  while($row = mysql_fetch_row($result)){
  mysql_query("DELETE FROM tablename WHERE id>$row[0] AND pwd='$row[1]'");
  }
  $id += $num;
再通过地址栏或cookie等传递$id,效率太低,处理了100分钟,才删除了30多万条重复

请问我应该怎么做,效率才会更高?谢谢

------解决方案--------------------
另建一表,创建主键,然后直接 insert into 另建一表 select * from oldtable
------解决方案--------------------
先拷贝表,然后删除字段,这样快,而且不占内存。
------解决方案--------------------
先用定制的select <> group by pwd INTO <outfile>
然后再load data into <newtable>呢
只要前边的select能保证速度,那么应该可行。
------解决方案--------------------
探讨

不知道你说的是不是下面这样:

CREATE TABLE mypwd (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
pwd VARCHAR(14) NOT NULL DEFAULT '',
PRIMARY KEY (id)
)ENGINE=MYISAM, CHARSET='utf8'

INSERT INTO mypwd(pwd) SELE……

------解决方案--------------------
千万级~路过膜拜