MYSQL中TRUNCATE和DELETE的區(qū)別

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


image.png

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回滾實驗

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


TRUNCATE回滾實驗

可以看到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操作速度也會有提升。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容