从 MySQL 表中删除重复条目的最有效方法
Most efficient way to delete duplicate entries from MySQL tables
我们有一个 table(姑且称之为 originalTbl
),其中包含我们要删除的重复条目。重复是指 AUTO INCREMENT 索引字段以外的所有值都相同。一种方法是创建一个新的 table,就像现有的 table(我们称它为 uniqueTbl
),然后进行如下查询:
INSERT INTO uniqueTbl (non-Index-field_1, non-Index-field_2, …, non-Index-field_n)
SELECT DISTINCT non-Index-field_1, non-Index-field_2, …, non-Index-field_n FROM originalTbl;
稍后我们将删除 originalTbl
并将 uniqueTbl
重命名为 originalTbl
。
但是,我正在寻找一种替代方法,它将直接从 originalTbl
中删除重复条目,而无需首先创建 uniqueTbl
然后将其重命名为 originalTbl
的开销].
一个选项使用自连接。假设您有除 id
之外的三列,它看起来像:
delete t
from mytable t
inner join (
select col1, col2, col3, min(id) minid
from mytable
group by col1, col2, col3
) t1
on t.col1 = t1.col1
and t.col2 = t1.col2
and t.col3 = t1.col3
and t.id > t.minid
这将删除重复项并保留最小的行 id
。
也就是说,您最初展示的方法很可能比这快得多。通过重命名 table 获得的开销非常小。
除非您的重复项很少,否则您的方法会快得多。如果你只有几个(比如不到1%),那你可以试试:
delete o
from originalTbl o left join
(select col1, col2, . . ., min(id) as min_id
from originalTbl o
group by col1, col2, . . .
) oo
on oo.min_id = o.id
where oo.min_id is null;
我们有一个 table(姑且称之为 originalTbl
),其中包含我们要删除的重复条目。重复是指 AUTO INCREMENT 索引字段以外的所有值都相同。一种方法是创建一个新的 table,就像现有的 table(我们称它为 uniqueTbl
),然后进行如下查询:
INSERT INTO uniqueTbl (non-Index-field_1, non-Index-field_2, …, non-Index-field_n)
SELECT DISTINCT non-Index-field_1, non-Index-field_2, …, non-Index-field_n FROM originalTbl;
稍后我们将删除 originalTbl
并将 uniqueTbl
重命名为 originalTbl
。
但是,我正在寻找一种替代方法,它将直接从 originalTbl
中删除重复条目,而无需首先创建 uniqueTbl
然后将其重命名为 originalTbl
的开销].
一个选项使用自连接。假设您有除 id
之外的三列,它看起来像:
delete t
from mytable t
inner join (
select col1, col2, col3, min(id) minid
from mytable
group by col1, col2, col3
) t1
on t.col1 = t1.col1
and t.col2 = t1.col2
and t.col3 = t1.col3
and t.id > t.minid
这将删除重复项并保留最小的行 id
。
也就是说,您最初展示的方法很可能比这快得多。通过重命名 table 获得的开销非常小。
除非您的重复项很少,否则您的方法会快得多。如果你只有几个(比如不到1%),那你可以试试:
delete o
from originalTbl o left join
(select col1, col2, . . ., min(id) as min_id
from originalTbl o
group by col1, col2, . . .
) oo
on oo.min_id = o.id
where oo.min_id is null;