【发布时间】:2017-12-08 02:26:49
【问题描述】:
我有兴趣从一个非常大的表(40+ 百万条记录,3+ GB 大小)中删除重复项,在确定重复项时还必须计算 NULL 列。 5.5.56-MariaDB,表格为InnoDB格式。
我遇到的问题是一些推荐的方法在 NULL 字段比较时不起作用。例如,我有一个表,它有大约十几个列,其中许多列可以包含 NULL 值,并且我希望 NULL 被视为任何其他值,因为如果一行在相同列中具有相同的 NULL 值,则它被认为是骗人的。
以下技术不起作用:
create table tmp like mytable;
alter table tmp ADD UNIQUE INDEX(field1,field2, field3,...);
insert IGNORE into tmp (select * from mytable);
此时,tmp 应该已删除所有重复项,但唯一索引中忽略了 NULL 列,因此它不起作用。如果它确实有效,那么我可以重命名这些表,或者截断原始表并复制过来(假设我想在原始表中保留一个主键)。
在处理 NULL 列时,删除大文件中的重复数据最有效的方法是什么?
附加说明:我有一个名为“recno”的字段,它是需要忽略的自动增量。
【问题讨论】:
-
您最终会得到少于一半的行数吗?或者更多?到目前为止,重点是前者。后者导致
DELETEingdups。 -
如果只有几列可以
NULL(或只有几列组合),那我可能有一个设计。有多少? -
我估计最多可能有 10-20% 的数据库被复制。不过可能更多。表中大约有 23 个不同类型的列,其中大多数可以有一个 NULL 值,包括一堆 VARCHAR(2) 保存“Y”“N”或 NULL,这会导致问题。 NULL 是有意义的,需要在检测欺骗时加以考虑。
-
以下查询已被证明有效,但它已经运行了超过 48 小时.. 必须有更快的方法:DELETE a FROM t1_test as a, t1_test as b WHERE (a.provnum =b.provnum) AND (a.field1=b.field1 OR (a.field1 IS NULL AND b.field1 IS NULL)) [20 其他列] AND (a.recno>b.recno);
-
我有几个大表我必须运行它。
标签: mysql sql database mariadb