在MySQL数据库中,当我们面对一个拥有大量数据的表,并且需要删除重复数据时,我们需要采用高效的方法来处理。今天了我们正好有张表,大概3千万条数据,重复数据有近2千多万条,本文将介绍几种方法,帮助您删除MySQL表中重复的数据中。
有张工单版本对应表bus_mark_plat_ver,表结构如下:
字段 | 类型 | 注释 |
---|---|---|
id | int(10) | |
sys_code | varchar(20) | 系统类型 |
version_code | varchar(50) | 平台版本 |
mark_id | varchar(15) | 工单id |
这张表了有3千万条数,我们需要保留sys_code,version_code,mark_id 重复的数据中保留最大的id的数据,删除其余的数据。
CREATE TABLE bus_mark_plat_ver_tmp LIKE bus_mark_plat_ver;
INSERT INTO bus_mark_plat_ver_tmp
SELECT MAX(id) AS id,sys_code,version_code,mark_id
FROM mng_navigation_banner_plat_ver
GROUP BY sys_code, version_code, mark_id;
delete from bus_mark_plat_ver
INSERT INTO bus_mark_plat_ver
SELECT id,sys_code,version_code,mark_id
FROM mng_navigation_banner_plat_ver_tmp;
DROP TABLE bus_mark_plat_ver_tmp;
创建临时表的优点:
创建临时表的缺点:
DELETE t1
FROM
bus_mark_plat_ver t1
LEFT JOIN ( SELECT MAX( id ) AS max_id, sys_code, version_code, mark_id FROM bus_mark_plat_ver GROUP BY sys_code, version_code, mark_id ) t2 ON t1.sys_code = t2.sys_code
AND t1.version_code = t2.version_code
AND t1.mark_id = t2.mark_id
AND t1.id = t2.max_id
WHERE
t2.max_id IS NULL;
这个查询将根据sys_type、bus_type和mark_type进行分组,并保留每个组中的最大id。然后,它使用左连接将原始表与这些最大id进行比较。如果连接失败(即max_id为NULL),则表示该行不是具有最大id的行,因此将被删除。
LEFT JOIN的优点:
LEFT JOIN的缺点:
DELETE
FROM
bus_mark_plat_ver t1
WHERE
id NOT IN ( SELECT max_id FROM ( SELECT MAX( id ) AS max_id FROM bus_mark_plat_ver GROUP BY sys_code, version_code, mark_id ) tmp );
NOT IN的优点:
NOT IN的缺点:
根据具体情况选择最合适的方法。如果性能和存储空间是主要关注点,并且查询逻辑相对简单,可以考虑使用 LEFT JOIN 或 NOT IN 来处理重复数据。如果可读性和操作灵活性更重要,并且处理逻辑相对复杂,创建临时表可能是更好的选择。无论使用哪种方法,请务必在生产环境之前进行充分的测试和验证。我们在此推荐使用第二种方法来删除重复数据。