从大表(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
请告诉我任何比这段代码更快的方法。
感谢.......
答案 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。表无法锁定。无论如何,你必须在操作之前停止写入该表。