MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

數據庫 MySQL Java低級攻城猿 2019-05-16

1、從概念上來講,它們是不同的,truncate是DDL語句,會隱式提交,所以,不能回滾,不會觸發觸發器。delete是DML語句,這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的觸發器,執行的時候將被觸發。

2、語法結構不同,truncate會刪除表中所有數據,delete後面可以跟where進行條件過濾,如果不跟任何條件,也會刪除所有數據

其他的不同,我們結合實例來說明,首先要創建一個表,建表語句如下:

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

再創建一個存儲過程,方便插入數據:

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

3、第三點不同就是,truncate是整體刪除,速度較快,而delete是逐條刪除,速度較慢

使用存儲過程向student表中插入10萬條數據,命令是call insert_student(100000),用truncate和delete兩種方法清空表中數據,查看耗時,表中已插入10萬條數據:

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

truncate table student執行耗時為:

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

再插入同樣的數據量,delete from student耗時為:

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

數據量比較少,不過也能看出來執行耗時的明顯區別,而delete執行後的顯示信息有Affected rows,可見是逐條執行的

4、truncate不寫服務器log,delete寫服務器log,從這點也可以明白truncate效率比delete高的原因

5、truncate刪除數據後,會把自增字段的值給重置,而delete會記住上次的自增字段值,再次插入後會接著上次字段值來增加

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

用truncate刪除數據後,再增加5條,結果如下:

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

可以發現自增字段重置了,用delete刪除上面的5條數據,然後向表中再添加3條數據,結果如下:

MySQL數據庫中,同樣是刪除數據,truncate與delete語句的區別

可以看出,delete記住上次自增的字段,在原來的基礎上進行自增。

6、表和索引所佔空間的不同。當表被truncate 後,這個表和索引所佔用的空間會恢復到初始大小,delete操作不會減少表或索引所佔用的空間。

相關推薦

推薦中...