MYSQL中TRUNCATE和DELETE都能夠清理表中的數(shù)據(jù),但是他們有什么區(qū)別呢?我們從下面的幾點(diǎn)來分析:

1. 條件刪除
這個比較好理解,因為DELETE是可以帶WHERE的,所以支持條件刪除;而TRUNCATE只能刪除整個表。
# delete - 條件刪除
DELETE FROM student WHERE id = 1;
# delete - 刪除整個表的數(shù)據(jù)
DELETE FROM student;
# truncate - 刪除整個表的數(shù)據(jù)
TRUNCATE TABLE student;
2. 事務(wù)回滾
由于DELETE是數(shù)據(jù)操作語言(DML - Data Manipulation Language),操作時原數(shù)據(jù)會被放到 rollback segment中,可以被回滾;而TRUNCATE是數(shù)據(jù)定義語言(DDL - Data Definition Language),操作時不會進(jìn)行存儲,不能進(jìn)行回滾。

可以看到DELETE是可以回滾成功的。

可以看到TRUNCATE是不能回滾成功的。
3. 清理速度
在數(shù)據(jù)量比較小的情況下,DELETE和TRUNCATE的清理速度差別不是很大。但是數(shù)據(jù)量很大的時候就能看出區(qū)別。由于第二項中說的,TRUNCATE不需要支持回滾,所以使用的系統(tǒng)和事務(wù)日志資源少。DELETE 語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項,固然會慢,但是相對來說也較安全。
4. 高水位重置
隨著不斷地進(jìn)行表記錄的DML操作,會不斷提高表的高水位線(HWM),DELETE操作之后雖然表的數(shù)據(jù)刪除了,但是并沒有降低表的高水位,隨著DML操作數(shù)據(jù)庫容量也只會上升,不會下降。所以如果使用DELETE,就算將表中的數(shù)據(jù)減少了很多,在查詢時還是很和DELETE操作前速度一樣。
而TRUNCATE操作會重置高水位線,數(shù)據(jù)庫容量也會被重置,之后再進(jìn)行DML操作速度也會有提升。