Mysql刪除數據的三種方式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';

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

optimize table demo2

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

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然后create,只不過這個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,尤其沒有備份的時候。

3、drop

Drop table Tablename

1)、drop:屬於數據庫DDL定義語言,同Truncate;

  • 執行后立即生效,無法找回
  • 執行后立即生效,無法找回
  • 執行后立即生效,無法找回

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

3)、小心使用drop,要刪表跑路的兄弟,請在訂票成功后再執行操作!

PS:可以這么理解,一本書,delete是把目錄撕了,truncate是把書的內容撕下來燒了,drop是把書燒了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM