以更快的方式从表中删除重复的行

时间:2013-04-18 07:30:39

标签: mysql

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

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

请告诉我任何比这段代码更快的方法。
感谢.......

5 个答案:

答案 0 :(得分:2)

我会试试这个:

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

这将仅保留具有最小ID的链接。

答案 1 :(得分:1)

删除 来自[表] rowid不在的地方(选择min(rowid) 来自[表] 按[主键列])分组

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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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

没试过。

P.S。别忘了锁表

P.P.S。表无法锁定。无论如何,你必须在操作之前停止写入该表。