萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 刪除資料全解析:DELETE vs TRUNCATE vs DROP 效能與行為差異

DELETE — DML,可回滾,逐行刪除

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
  • 帶 WHERE:刪除符合條件的行,觸發 ON DELETE 觸發器,寫入 Binlog(Row 格式記錄每行),可 ROLLBACK。
  • 不帶 WHERE:清空全表,**極度危險**,會逐行刪除、產生大量 Binlog、耗時極長、高水位線不下降、自增 ID 不歸零。
  • LIMIT:分批刪除大量資料,避免長鎖表(如 DELETE FROM t WHERE ... LIMIT 1000 循環執行)。

TRUNCATE — DDL,不可回滾,重建表

TRUNCATE [TABLE] tbl_name
  • 本質:DROP 表 → 依結構重建空表。
  • 極快(僅元資料操作),不觸發觸發器,不寫 Binlog 行記錄(Statement 格式記錄一條 Truncate),不可回滾。
  • 自增計數器歸零(AUTO_INCREMENT = 1)。
  • 釋放資料頁,高水位線歸零(InnoDB 5.5+ 可 TRUNCATE TABLE ... REUSE STORAGE 保留空間)。
  • 外鍵約束存在時無法執行(需先刪除 FK)。

DROP — DDL,徹底移除表結構

  • 刪除表定義、資料、索引、觸發器、約束;依賴該表的 View/Procedure 變 INVALID。
  • 釋放所有磁碟空間。

效能與行為對比總表

特性DELETE (無 WHERE)TRUNCATEDROP
速度慢(逐行)極快(元資料)極快
事務安全支援 ROLLBACK不支援不支援
觸發器觸發 FOR EACH ROW不觸發觸發器隨表消失
自增 ID保留繼續歸零表不存在
高水位線不變歸零釋放空間
外鍵限制受 FK 約束有 FK 失敗級聯刪除或限制
Binlog 量巨大(行級)極小(Statement)極小

選型建議

  • 刪除部分資料:DELETE WHERE ...(加索引、分批 Commit)。
  • 清空全表、不需回滾、無外鍵:TRUNCATE TABLE(秒級完成)。
  • 表結構不再需要:DROP TABLE。
  • 整理碎片:TRUNCATE ... REUSE STORAGE + 重新導入資料。
  • 涉及事務/觸發器:只能用 DELETE。
copyright © 萬盛學電腦網 all rights reserved