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) | TRUNCATE | DROP |
| 速度 | 慢(逐行) | 極快(元資料) | 極快 |
| 事務安全 | 支援 ROLLBACK | 不支援 | 不支援 |
| 觸發器 | 觸發 FOR EACH ROW | 不觸發 | 觸發器隨表消失 |
| 自增 ID | 保留繼續 | 歸零 | 表不存在 |
| 高水位線 | 不變 | 歸零 | 釋放空間 |
| 外鍵限制 | 受 FK 約束 | 有 FK 失敗 | 級聯刪除或限制 |
| Binlog 量 | 巨大(行級) | 極小(Statement) | 極小 |
選型建議
- 刪除部分資料:
DELETE WHERE ...(加索引、分批 Commit)。
- 清空全表、不需回滾、無外鍵:
TRUNCATE TABLE(秒級完成)。
- 表結構不再需要:
DROP TABLE。
- 整理碎片:
TRUNCATE ... REUSE STORAGE + 重新導入資料。
- 涉及事務/觸發器:只能用
DELETE。