如何删除MySQL中具有2000万行数据集的重复项?

如何删除MySQL中具有2000万行数据集的重复项?,mysql,sql,Mysql,Sql,我有一个很大的MySQL数据库。我需要快速删除重复的项目。下面是它的外观: id | text1 | text2| 1 | 23 | 43 | 2 | 23 | 44 | 3 | 23 | 44 | 删除后,表的剩余部分应为: id | text1 | text2| 1 | 23 | 43 | 3 | 23 | 44 | 我不在乎id。最重要的是不会有重复的项目消失。您可以尝试以下方法: ALTER I

我有一个很大的MySQL数据库。我需要快速删除重复的项目。下面是它的外观:

id | text1 | text2|    
1  | 23    |  43  |   
2  | 23    |  44  |  
3  | 23    |  44  |
删除后,表的剩余部分应为:

id | text1 | text2|   
1  | 23    |  43  |   
3  | 23    |  44  |
我不在乎id。最重要的是不会有重复的项目消失。

您可以尝试以下方法:

ALTER IGNORE TABLE my_tablename ADD UNIQUE INDEX idx_name (text1 , text2);
也就是说,尝试向列添加
唯一索引
,并
更改表

这有一个优点,将来也不会有重复的行可以插入到表中

您可以尝试以下方法:

ALTER IGNORE TABLE my_tablename ADD UNIQUE INDEX idx_name (text1 , text2);
也就是说,尝试向列添加
唯一索引
,并
更改表

这有一个优点,将来也不会有重复的行可以插入到表中

运行以下命令:

SELECT COUNT(*), text1, text2
GROUP BY text1, text2
HAVING COUNT(*) > 1;
当您在这里找到行时,为每个匹配删除一行,然后再次运行它

我不确定它在性能方面会是什么样子-如果您在脱机状态下执行此操作,也许这并不重要?

运行此:

SELECT COUNT(*), text1, text2
GROUP BY text1, text2
HAVING COUNT(*) > 1;
DELETE FROM t WHERE id NOT IN
(SELECT MIN(id) FROM t GROUP BY text1, text2)
当您在这里找到行时,为每个匹配删除一行,然后再次运行它


我不确定它在性能方面会是什么样子——如果您在脱机状态下这样做,也许这并不重要?

“不关心”有时表示存在更大的问题!你应该关心!Id在我的项目中没有任何意义。它可以是任何数字。我唯一想做的就是删除所有重复的项目可能的重复我认为草莓意味着你应该在项目开始时关注这一点,以避免所有重复的项目!难道你不能阻止重复,这样你就不需要删除它们了吗?定义跨(text1,text2)的唯一索引。“不关心”有时表示更大的问题!你应该关心!Id在我的项目中没有任何意义。它可以是任何数字。我唯一想做的就是删除所有重复的项目可能的重复我认为草莓意味着你应该在项目开始时关注这一点,以避免所有重复的项目!难道你不能阻止重复,这样你就不需要删除它们了吗?跨(text1、text2)定义唯一索引。分组依据无效。这需要很长时间。在这种情况下,你确定这很重要吗?在许多情况下,“它需要快”,它不需要快。您可以脱机进行查询吗?分组方式效率不高。这需要很长时间。在这种情况下,你确定这很重要吗?在许多情况下,“它需要快”,它不需要快。你能离线进行查询吗?我从来没有尝试过这个-出于兴趣,
IGNORE
子句是否意味着dup行被默默忽略+1@halfer:-当然可以!我从未尝试过这一点-出于兴趣,
IGNORE
子句是否意味着dup行被静默忽略+1@halfer:-当然可以!
DELETE FROM t WHERE id NOT IN
(SELECT MIN(id) FROM t GROUP BY text1, text2)