sql - MySQL快速从大数据库中删除重复项

标签 sql mysql duplicates

我的大型(>Mil 行)MySQL 数据库被重复项弄乱了。我认为它可能是填充它们的整个数据库的 1/4 到 1/2。 我需要快速摆脱它们(我的意思是查询执行时间)。 这是它的外观:
id(索引)|文本1 |文本2 |正文3
text1 & text2 组合应该是唯一的, 如果有任何重复,则只应保留一个与 text3 NOT NULL 的组合。示例:

1 | abc | def | NULL  
2 | abc | def | ghi  
3 | abc | def | jkl  
4 | aaa | bbb | NULL  
5 | aaa | bbb | NULL  

...变成:

1 | abc | def | ghi   #(doesn't realy matter id:2 or id:3 survives)   
2 | aaa | bbb | NULL  #(if there's no NOT NULL text3, NULL will do)

新的 id 可以是任何东西,它们不依赖于旧的表 id。
我试过这样的事情:

CREATE TABLE tmp SELECT text1, text2, text3
FROM my_tbl;
GROUP BY text1, text2;
DROP TABLE my_tbl;
ALTER TABLE tmp RENAME TO my_tbl;

或 SELECT DISTINCT 和其他变体。
虽然他们在小型数据库上工作,但我的查询执行时间非常长(实际上从未到达终点;> 20 分钟)

有没有更快的方法来做到这一点?请帮我解决这个问题。

最佳答案

我相信这会做到,使用重复键 + ifnull():

create table tmp like yourtable;

alter table tmp add unique (text1, text2);

insert into tmp select * from yourtable 
    on duplicate key update text3=ifnull(text3, values(text3));

rename table yourtable to deleteme, tmp to yourtable;

drop table deleteme;

应该比任何需要 group by 或 distinct 或子查询,甚至 order by 的东西都要快得多。这甚至不需要文件排序,这会降低大型临时表的性能。仍需要对原始表进行全面扫描,但无法避免。

关于sql - MySQL快速从大数据库中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651999/

相关文章:

sql - 一个项目中允许的最大数据集数

sql - where 子句中的参数顺序是否会影响表是否使用索引?

sql - 在 SQL Server 中删除带有联接的表

javascript - 如何在 Javascript 中比较对象数组内的对象数组并删除重复的对象?

sql - PostgreSQL 中不同值的 LIMIT

sql - 如何在表格的每一列中获取 false 的数量?

php - 将 mysql_connect 更改为 mysqli 导致功能失败

mysql加入线程收件箱

php - 从维度数组计算相同日期值

lisp - 作业 : Lisp items that appear more than once in a list