首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 刪除重複數據高效方案:500 萬行 10 分鐘去重實戰

     編輯: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;
  • 利用 MIN(id) 確定保留哪一行(業務通常保留最早插入)。
  • GROUP BY SFZHM 產生 180 萬組,極快。

步驟 2:建立目標表結構

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

用 MyISAM 避免事務開銷,純導入更快;若需事務可用 InnoDB。

步驟 3:按 ID 關聯回寫所需字段

INSERT INTO res (sfz)
SELECT d.SFZHM
FROM data_content_152 d
JOIN tmp3 t ON d.id = t.col1;
  • JOIN 比 IN/EXISTS 效率高得多(MySQL 對 JOIN 優化成熟)。
  • 僅回寫業務需要的 SFZHM,避免全行拷貝開銷。

效能數據

  • 500 萬 → 180 萬,總耗時 **約 10 分鐘**(含建表、去重、寫入)。
  • 核心索引:data_content_152(SFZHM)、data_content_152(id PK)、tmp3(col1 PK)。

通用模板化

  方案優點缺點適用場景
  
    本文 JOIN 臨時表速度快、邏輯清晰、可控需額外臨時表空間千萬級去重首選
    DELETE ... WHERE id NOT IN (SELECT MIN(id) ...)原地刪除,無額外表NOT IN 子查詢極慢、易鎖表僅適合幾萬行小表
    ALTER IGNORE TABLE ... ADD UNIQUE KEY (uniq_col)一條命令完成(5.7 前)5.7+ 移除 IGNORE、不可控保留哪行、鎖表久不推薦
    ROW_NUMBER() OVER (PARTITION BY uniq_col ORDER BY id) (8.0+)標準 SQL、無臨時表、可保留任意行需 8.0+、大表排序開銷大8.0 環境首選
  

							
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved