当前位置:首页 > 问答 > 正文

数据库优化|数据清理 mysql去重操作方法详解_删除重复数据只保留一条

🧹数据库大扫除:MySQL去重操作全攻略(只留一条不手软!)


💼 典型翻车现场

"小王盯着报表里重复的500条用户订单抓狂,系统卡得像老牛拉车——这已经是本周第三次收到客户投诉了!" 数据库里的重复数据就像衣柜里堆积的旧衣服,既占空间又影响效率,今天我们就手把手教你用MySQL给数据来次大扫除!✨


🔍 先搞清楚敌人是谁

执行这个SQL看看哪些列在"组团刷副本":

SELECT username, email, COUNT(*) 
FROM users 
GROUP BY username, email 
HAVING COUNT(*) > 1;

👆 这个查询会暴露所有重复的"用户名+邮箱"组合,就像照妖镜让重复数据现原形!


� 四大绝杀技(总有一款适合你)

方法1️⃣:临时表替身术

-- 创建临时表存唯一数据
CREATE TABLE temp_users LIKE users;
-- 用DISTINCT过滤后插入
INSERT INTO temp_users 
SELECT DISTINCT * FROM users;
-- 狸猫换太子
RENAME TABLE users TO users_backup, temp_users TO users;

💡 适合中小型表,操作直观像玩拼图

数据库优化|数据清理 mysql去重操作方法详解_删除重复数据只保留一条

方法2️⃣:自连接查杀

DELETE t1 FROM users t1
INNER JOIN users t2 
WHERE 
    t1.id < t2.id AND  -- 保留ID大的记录
    t1.username = t2.username AND 
    t1.email = t2.email;

⚠️ 注意:执行前务必备份!这个操作像用手术刀切除肿瘤

方法3️⃣:窗口函数炫技(MySQL 8.0+专属)

DELETE FROM users 
WHERE id NOT IN (
    SELECT min_id FROM (
        SELECT MIN(id) as min_id 
        FROM users 
        GROUP BY username, email
    ) as keepers
);

🚀 新版本利器,像用智能吸尘器精准吸除灰尘

方法4️⃣:添加唯一索引拦截

ALTER TABLE users 
ADD UNIQUE INDEX idx_unique_user (username, email);

🛡️ 预防胜于治疗!设置后重复插入会直接报错


🧪 实战演习

假设有订单表需要去重:

-- 步骤1:先查重复订单
SELECT order_no, COUNT(*) 
FROM orders 
GROUP BY order_no 
HAVING COUNT(*) > 1;
-- 步骤2:保留最新记录
DELETE FROM orders 
WHERE id NOT IN (
    SELECT MAX(id) 
    FROM orders 
    GROUP BY order_no
);

🎯 重点:一定要先用SELECT测试再执行DELETE!

数据库优化|数据清理 mysql去重操作方法详解_删除重复数据只保留一条


💾 重要安全提醒

  1. 操作前用CREATE TABLE backup_202508 AS SELECT * FROM 原表;备份
  2. 大表建议在业务低峰期操作(比如凌晨3点🌙)
  3. 超过100万条数据推荐分批处理:
    DELETE FROM users 
    WHERE id IN (重复ID列表) 
    LIMIT 10000;  -- 每次删1万条

🏆 效果验收

去重后跑个健康检查:

SELECT COUNT(*) AS before FROM users_backup;
SELECT COUNT(*) AS after FROM users;
SELECT (before-after) AS 消灭的重复数据;

看到查询速度提升时,你会感谢现在勤劳的自己!💪

(注:本文方法基于MySQL 5.7+环境验证,最后更新2025年8月)

发表评论