上一篇
📢 最新动态(2025-08)
MySQL 8.4 近期优化了 GROUP BY
和窗口函数的性能,处理大规模重复数据时效率提升约15%!对于数据清洗和去重任务来说,这简直是开发者的福音~
重复数据不仅浪费存储空间,还可能导致统计错误、业务逻辑混乱。
🛠️ 目标:快速定位重复数据,并清理或合并它们!
最经典的查重方式,适合大多数场景:
SELECT 字段1, 字段2, COUNT(*) AS 重复次数 FROM 表名 GROUP BY 字段1, 字段2 HAVING COUNT(*) > 1; -- 筛选重复记录
📝 示例:找出users
表中重复的邮箱:
SELECT email, COUNT(*) AS dup_count FROM users GROUP BY email HAVING dup_count > 1;
如果需要同时显示重复数据的完整行,用窗口函数更高效:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY 字段1, 字段2) AS row_num FROM 表名 ) AS t WHERE row_num > 1; -- 标记重复行
💡 优势:
DELETE
删除重复项(见第5节) 有时需要按重复量排序,优先处理高频重复项:
SELECT product_id, COUNT(*) AS duplicate_count FROM orders GROUP BY product_id HAVING duplicate_count > 1 ORDER BY duplicate_count DESC; -- 按重复次数降序
查到重复数据后,通常需要清理,以下是安全删除方法:
用临时表
-- 步骤1:创建临时表存储唯一数据 CREATE TABLE temp_table AS SELECT DISTINCT * FROM 原表; -- 步骤2:清空原表并插回数据 TRUNCATE TABLE 原表; INSERT INTO 原表 SELECT * FROM temp_table; DROP TABLE temp_table;
用ROW_NUMBER()(MySQL 8.0+)
DELETE FROM 表名 WHERE id NOT IN ( SELECT MIN(id) -- 保留ID最小的记录 FROM ( SELECT id, ROW_NUMBER() OVER (PARTITION BY 字段1, 字段2) AS rn FROM 表名 ) AS t WHERE rn = 1 );
ALTER TABLE users ADD UNIQUE (email); -- 阻止重复插入
INSERT IGNORE INTO users (email) VALUES ('test@example.com'); -- 忽略重复
GROUP BY + HAVING
简单直接 ROW_NUMBER()
)效率更高 🎯 一句话:查重是数据健康的“体检”,定期清理让数据库跑得更快!
本文由 曾依秋 于2025-08-01发表在【云服务器提供商】,文中图片由(曾依秋)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/508689.html
发表评论