0

从大表(500000+ 行)中删除重复行的最佳方法是什么。
我有一个运行良好的代码,但速度不够快。
这是一个代码。

DELETE foo
FROM foo
  INNER JOIN (SELECT
        link,
        MIN(id) AS MinId
          FROM foo
          GROUP BY link) b
    ON foo.link = b.link
      AND foo.id != b.MinId

请告诉我比这段代码更快的任何其他方式。
谢谢.......

4

5 回答 5

2

我会试试这个:

DELETE foo1
FROM foo foo1 INNER JOIN foo foo2
     ON foo1.link = foo2.link AND foo1.id>foo2.id

这将只保留具有最小 id 的链接。

于 2013-04-18T07:35:57.130 回答
1

从 [table] 中删除 rowid 不在(从 [table] group by [primary key columns] 中选择 min(rowid))

它将有助于从基于 rowid 的表中删除重复项。

于 2013-04-18T11:47:33.203 回答
0

快捷方式:添加约束

ALTER IGNORE TABLE `foo` ADD UNIQUE `link` (`link`);
DROP INDEX `link` ON `foo`; -- to restore table state

但我认为更好地创建有约束的新表

CREATE  TABLE `temp` LIKE `foo`;
ALTER IGNORE TABLE `temp` ADD UNIQUE `link` (`link`);
INSERT IGNORE INTO `temp` SELECT * FROM `foo`;
RENAME TABLE `foo` TO `old_foo`, `temp` TO `foo`;
DROP TABLE `old_foo`;
DROP INDEX `link` ON `foo`; -- to restore table state

没有测试它。

PS别忘了锁表

PPS 表无法锁定。无论如何,您必须在操作之前停止写入该表。

于 2013-04-18T07:46:47.807 回答
0

询问:

DELETE f
FROM foo f
WHERE (SELECT MIN(f1.id) 
       FROM (SELECT * FROM foo) f1
       WHERE f1.link = f.link) != f.id

查询删除 id=50 到 id=100 之间的重复记录:

DELETE f
FROM foo f
WHERE (SELECT MIN(f1.id) 
       FROM (SELECT * FROM foo) f1
       WHERE f1.link = f.link) != f.id
AND f.id >= 50
AND f.id <= 100
于 2013-04-18T07:42:23.557 回答
0

尝试这个

DELETE foo
FROM foo
  INNER JOIN (SELECT
                link,
                MIN(id) AS MinId
          FROM foo
          GROUP BY link) b
    ON foo.link = b.link
WHERE foo.id <> b.MinId
于 2013-04-18T07:36:59.997 回答