MySQL:刪除操作Delete、Truncate、Drop用法比較
今天小編給大家梳理一下MySQL刪除操作Delete、Truncate、Drop用法有什么區別,到底該如何合理使用,希望對大家能有幫助!
1、執行速度比較
Delete、Truncate、Drop關鍵字都可以刪除數據
drop>truncate>delete
2、原理方面
2.1 delete
delete屬于數據庫DML操作語言,只會刪除數據表中的記錄,會執行事務,執行的時候也會觸發觸發器。
InnoDB數據庫引擎中,執行delete操作只會給刪除的記錄打上了刪除標記,并不會真正刪除數據,只是把刪除的數據記錄設置為不可見,不會釋放磁盤空間,如果插入新的數據可以覆蓋該部分空間。
如果開啟事務的話,執行delete操作,會先將要刪除數據緩存到rollback segement中,等事務commit之后才生效。
delete from table_name 不帶查詢條件會刪除表的全部數據,MyISAM引擎會立刻釋放磁盤空間,InnoDB 不會釋放磁盤空間;如果帶查詢條件的話都不會釋放磁盤空間,可以執行optimize table table_name 會立刻釋放磁盤空間。建議如果需要釋放存儲空間的話可以執行delete后,然后執行optimize table table_name 語句達到清理磁盤空間的目的。
-- 查詢數據庫test對應的表t_user 占用的磁盤空間
- select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') as table_size
- from information_schema.tables
- where table_schema='test' AND table_name='t_user';
說明:delete 操作是逐行執行刪除的,并且同時將每行的的刪除操作日志記錄在redo和undo表空間中去,便于進行回滾(rollback)和重做操作,因此生成的大量操作日志也會占用磁盤空間。
2.2 truncate
truncate是數據庫DDL定義語言,不受事務影響,也不會觸發 trigger。執行操作后會立即生效,無法找回刪除的數據。
執行truncate table table_name 會立刻釋放磁盤空間 ,不管是 InnoDB和MyISAM 都一樣 。
truncate可以退快速清空一個表。并且重置auto_increment自動增長的值。針對不同類型的數據存儲引擎是有區別的,具體如下:
MyISAM:truncate會重置auto_increment(自增序列)的值為1。而delete后表仍然保持auto_increment。
InnoDB:truncate會重置auto_increment的值為1。delete后表仍然保持auto_increment。但是在做delete整個表之后重啟MySQL的話,則重啟后的auto_increment會被置為1。
說明:InnoDB的表本身是無法持久保存auto_increment。delete表之后auto_increment仍然保存在內存,但是重啟后就找不到了,只能從1開始。實際上重啟后的auto_increment會從 SELECT 1+MAX(ai_col) FROM t 開始。
使用truncate操作的時候要最好備份表,避免出現不可挽回的情況。
2.3 drop
drop屬于數據庫DDL定義語言,和truncate一樣。執行后會立即生效,不可恢復。
drop table table_name 執行成功后不管是MyISM還是InnoDB都會立刻釋放磁盤空間 ,并且會刪除該數據表上依賴的約束(constrain)、觸發器(trigger)、索引(index); 依賴于該表的存儲過程/函數將保留,但是會變為失效狀態。
總結
在工作當中執行數據庫刪除的時候一定要慎重再慎重,建議每次進行數據刪除的使用最好數據表的備份工作,這樣就會大大減少你刪除跑路的幾率。很多時候不要過于相信自己的動手能力,老虎還有打盹的時候,萬一手滑了呢。盡可能養成好的數據庫運維習慣,這樣會讓自己少跌跟頭,你的事業才會更加順利。
本文轉載自微信公眾號「IT技術分享社區」,可以通過以下二維碼關注。轉載本文請聯系IT技術分享社區公眾號。
個人博客網站:https://programmerblog.xyz