首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 千萬級去重實戰:MIN(id) 分組 + 新表導入,十分鐘搞定五百萬重複數據

     編輯:MySQL 資料庫相關知識

場景

表 data_content_152 500 萬行,實際唯一身份證號(SFZHM)僅 180 萬,需高效去重。

三步走策略

步驟 1:提取每組最小 ID

CREATE TABLE tmp3 AS
SELECT MIN(id) AS col1 FROM data_content_152 GROUP BY SFZHM;

利用主鍵 id 自增特性,MIN(id) 代表最早插入的記錄。

步驟 2:建立目標表

CREATE TABLE `res` (
  `id` INT(11),
  `sfz` CHAR(20)
) ENGINE=MyISAM;

步驟 3:關聯導入去重數據

INSERT INTO res (sfz)
SELECT d.sfzhm FROM data_content_152 d
JOIN tmp3 t ON d.id = t.col1;

效能關鍵點

  • GROUP BY SFZHM 走索引(需建立 SFZHM 索引)
  • MIN(id) 聚合函數無需回表
  • 中間表 tmp3 僅 180 萬行,JOIN 極快
  • MyISAM 目標表無事務開銷,批量插入更快

替代方案對比

線上無鎖去重進階

若不可停寫,可用 pt-archiver 或 gh-ost 線上遷移,或利用 INSERT IGNORE INTO new_table SELECT ... FROM old_table 配合唯一索引逐批遷移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法耗時缺點
NOT IN / NOT EXISTS極慢子查詢執行計劃差
DELETE ... JOIN慢大事務、鎖表、binlog 膨脹
新表導入法(本文)~10 分鐘需雙倍磁碟空間、業務切換窗口