天天看點

delete、truncate、drop,千萬别用錯了。。

MySQL删除資料的方式都有哪些?

咱們常用的三種删除方式:通過 delete、truncate、drop 關鍵字進行删除;這三種都可以用來删除資料,但場景不同。

一、從執行速度上來說

drop > truncate >> DELETE

二、從原理上講

1、DELETE

DELETE from TABLE_NAME where xxx

1、DELETE屬于資料庫DML操作語言,隻删除資料不删除表的結構,會走事務,執行時會觸發trigger;

2、在 InnoDB 中,DELETE其實并不會真的把資料删除,mysql 實際上隻是給删除的資料打了個标記為已删除,是以 delete 删除表中的資料時,表檔案在磁盤上所占空間不會變小,存儲空間不會被釋放,隻是把删除的資料行設定為不可見。雖然未釋放磁盤空間,但是下次插入資料的時候,仍然可以重用這部分空間(重用 → 覆寫)。

3、DELETE執行時,會先将所删除資料緩存到rollback segement中,事務commit之後生效;

4、delete from table_name删除表的全部資料,對于MyISAM 會立刻釋放磁盤空間,InnoDB 不會釋放磁盤空間;

5、對于delete from table_name where xxx 帶條件的删除, 不管是InnoDB還是MyISAM都不會釋放磁盤空間;

6、delete操作以後使用 optimize table table_name 會立刻釋放磁盤空間。不管是InnoDB還是MyISAM 。是以要想達到釋放磁盤空間的目的,delete以後執行optimize table 操作。

示例:檢視表占用硬碟空間大小的SQL語句如下:(用M做展示機關,資料庫名:csjdemo,表名:demo2)

select 
  concat(round(sum(DATA_LENGTH/1024/1024),2),'M') as table_size 
from information_schema.tables
where table_schema='csjdemo' AND table_name='demo2';      
delete、truncate、drop,千萬别用錯了。。

然後執行空間優化語句,以及執行後的表Size變化:

optimize table demo2      
delete、truncate、drop,千萬别用錯了。。

再看看這張表的大小,就隻剩下表結構size了。

delete、truncate、drop,千萬别用錯了。。

7、delete 操作是一行一行執行删除的,并且同時将該行的的删除記錄檔記錄在redo和undo表空間中以便進行復原(rollback)和重做操作,生成的大量日志也會占用磁盤空間。

2、truncate

Truncate table TABLE_NAME

1、truncate:屬于資料庫DDL定義語言,不走事務,原資料不放到 rollback segment 中,操作不觸發 trigger。

執行後立即生效,無法找回

2、truncate table table_name 立刻釋放磁盤空間 ,不管是 InnoDB和MyISAM 。truncate table其實有點類似于drop table 然後creat,隻不過這個create table 的過程做了優化,比如表結構檔案之前已經有了等等。是以速度上應該是接近drop table的速度;

3、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 開始。

4、小心使用 truncate,尤其沒有備份的時候,如果誤删除線上的表,記得及時聯系中國民航,訂票電話:400-806-9553

3、drop

Drop table Tablename

1、drop:屬于資料庫DDL定義語言,同Truncate;

2、drop table table_name 立刻釋放磁盤空間 ,不管是 InnoDB 和 MyISAM; drop 語句将删除表的結構被依賴的限制(constrain)、觸發器(trigger)、索引(index); 依賴于該表的存儲過程/函數将保留,但是變為 invalid 狀态。

3、小心使用 drop ,要删表跑路的兄弟,請在訂票成功後在執行操作!訂票電話:400-806-9553

可以這麼了解,一本書,delete是把目錄撕了,truncate是把書的内容撕下來燒了,drop是把書燒了。

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。 本文連結: