mysql - MYSQL数据千万以上,如何删除重复数据?

标签 mysql performance sql-delete

我抓取了很多数据,并将其保存到mysql表中,但是有一些重复的数据,我想以有效的方式删除它们。

表格 (ads_info)


+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| id               | int(11)      | NO   | PRI | NULL    | auto_increment |
| ad_id            | varchar(64)  | YES  | MUL | NULL    |                |
| adset_id         | varchar(64)  | YES  | MUL | NULL    |                |
| campaign_id      | varchar(64)  | YES  |     | NULL    |                |
| account_id       | varchar(64)  | YES  | MUL | NULL    |                |
| conversion_specs | text         | YES  |     | NULL    |                |
| creative         | text         | YES  |     | NULL    |                |
| effective_status | varchar(32)  | YES  |     | NULL    |                |
| status           | varchar(32)  | YES  |     | NULL    |                |
| name             | varchar(255) | YES  |     | NULL    |                |
| tracking_specs   | text         | YES  |     | NULL    |                |
| object_store_url | varchar(255) | YES  |     | NULL    |                |
| link             | varchar(255) | YES  |     | NULL    |                |
| object_type      | varchar(32)  | YES  |     | NULL    |                |
| updated_time     | timestamp    | YES  |     | NULL    |                |
| created_time     | timestamp    | YES  |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+

显示创建表 ads_info


CREATE TABLE `ads_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ad_id` varchar(64) DEFAULT NULL,
  `adset_id` varchar(64) DEFAULT NULL,
  `campaign_id` varchar(64) DEFAULT NULL,
  `account_id` varchar(64) DEFAULT NULL,
  `conversion_specs` text,
  `creative` text,
  `effective_status` varchar(32) DEFAULT NULL,
  `status` varchar(32) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `tracking_specs` text,
  `object_store_url` varchar(255) DEFAULT NULL,
  `link` varchar(255) DEFAULT NULL,
  `object_type` varchar(32) DEFAULT NULL,
  `updated_time` timestamp NULL DEFAULT NULL,
  `created_time` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ad_id` (`ad_id`),
  KEY `adset_id` (`adset_id`),
  KEY `account_id` (`account_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18827534 DEFAULT CHARSET=utf8mb4

表格中有超过千万条广告信息,其中大约有 40 条是重复的。我想删除所有重复的数据。

这是我糟糕的尝试

1)选择所有重复的ad_id

select ad_id  from ads_info group by ad_id having count(id) > 1;
#42387 rows in set (12.42 sec) 

查询花费了12s,但我不知道如何进行优化。

2)使用子查询删除所有这些重复的数据。

delete  from ads_info where ad_id in ( select ad_id from (select ad_id from ads_info group by ad_id having count(id) > 1) t);

但是我这次尝试没有得到mysql的响应,它似乎是被查询挂起的。

如何删除这些重复的数据?

最佳答案

您首先需要一个UNIQUE key 。这将添加它重复数据删除:

ALTER IGNORE TABLE ads_info
    ADD UNIQUE KEY(ad_id);

关于mysql - MYSQL数据千万以上,如何删除重复数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57535118/

相关文章:

php - 如何从mysql中的多个表中按日期顺序获取数据?

java - 在 Java 中,匿名内部类型是否会影响性能?

postgresql - 使用游标在 Postgres 中批量删除

mysql - mysql中如何删除一行?

sql-server - Sql Server 删除和合并性能

php - 带有 in_array 循环的窃听功能

mysql - 允许在程序中授予权限吗?

mysql - 使用递归 MySQL 查询从父行到子行获取值

c# - 我应该重复使用点和矩形还是创建新的?

java - 推荐用于 Java 实现的低内存 HashMap