MySQL刪除數(shù)據(jù)的方式都有哪些?
咱們常用的三種刪除方式:通過 delete黍衙、truncate泥畅、drop 關(guān)鍵字進行刪除;這三種都可以用來刪除數(shù)據(jù)琅翻,但場景不同位仁。
一柑贞、從執(zhí)行速度上來說
drop > truncate >> DELETE
二、從原理上講
1聂抢、DELETE
DELETE from TABLE_NAME where xxx
1钧嘶、DELETE屬于數(shù)據(jù)庫DML操作語言,只刪除數(shù)據(jù)不刪除表的結(jié)構(gòu)琳疏,會走事務有决,執(zhí)行時會觸發(fā)trigger;
2空盼、在 InnoDB 中书幕,DELETE其實并不會真的把數(shù)據(jù)刪除,mysql 實際上只是給刪除的數(shù)據(jù)打了個標記為已刪除我注,因此 delete 刪除表中的數(shù)據(jù)時按咒,表文件在磁盤上所占空間不會變小,存儲空間不會被釋放但骨,只是把刪除的數(shù)據(jù)行設(shè)置為不可見励七。雖然未釋放磁盤空間,但是下次插入數(shù)據(jù)的時候奔缠,仍然可以重用這部分空間(重用 → 覆蓋)掠抬。
3、DELETE執(zhí)行時校哎,會先將所刪除數(shù)據(jù)緩存到rollback segement中两波,事務commit之后生效;
4、delete from table_name刪除表的全部數(shù)據(jù),對于MyISAM 會立刻釋放磁盤空間闷哆,InnoDB 不會釋放磁盤空間;
5腰奋、對于delete from table_name where xxx 帶條件的刪除, 不管是InnoDB還是MyISAM都不會釋放磁盤空間;
6、delete操作以后使用 optimize table table_name 會立刻釋放磁盤空間抱怔。不管是InnoDB還是MyISAM 劣坊。所以要想達到釋放磁盤空間的目的,delete以后執(zhí)行optimize table 操作屈留。
示例:查看表占用硬盤空間大小的SQL語句如下:(用M做展示單位局冰,數(shù)據(jù)庫名: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';
然后執(zhí)行空間優(yōu)化語句灌危,以及執(zhí)行后的表Size變化:
optimize table demo2
再看看這張表的大小康二,就只剩下表結(jié)構(gòu)size了。
7勇蝙、delete 操作是一行一行執(zhí)行刪除的沫勿,并且同時將該行的的刪除操作日志記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,生成的大量日志也會占用磁盤空間。
2藕帜、truncate
Truncate table TABLE_NAME
1烫罩、truncate:屬于數(shù)據(jù)庫DDL定義語言,不走事務洽故,原數(shù)據(jù)不放到 rollback segment 中,操作不觸發(fā) trigger盗誊。
執(zhí)行后立即生效时甚,無法找回
執(zhí)行后立即生效,無法找回
執(zhí)行后立即生效哈踱,無法找回
2荒适、truncate table table_name 立刻釋放磁盤空間 ,不管是 InnoDB和MyISAM 开镣。truncate table其實有點類似于drop table 然后creat,只不過這個create table 的過程做了優(yōu)化刀诬,比如表結(jié)構(gòu)文件之前已經(jīng)有了等等。所以速度上應該是接近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仍然保存在內(nèi)存皂岔,但是重啟后就丟失了,只能從1開始规个。實質(zhì)上重啟后的auto_increment會從 SELECT 1+MAX(ai_col) FROM t 開始凤薛。
4、小心使用 truncate诞仓,尤其沒有備份的時候缤苫,如果誤刪除線上的表,記得及時聯(lián)系中國民航墅拭,訂票電話:400-806-9553
3活玲、drop
Drop table Tablename
1、drop:屬于數(shù)據(jù)庫DDL定義語言,同Truncate舒憾;
執(zhí)行后立即生效镀钓,無法找回
執(zhí)行后立即生效,無法找回
執(zhí)行后立即生效镀迂,無法找回
2丁溅、drop table table_name 立刻釋放磁盤空間 ,不管是 InnoDB 和 MyISAM; drop 語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain)探遵、觸發(fā)器(trigger)窟赏、索引(index); 依賴于該表的存儲過程/函數(shù)將保留,但是變?yōu)?invalid 狀態(tài)。
3箱季、小心使用 drop 涯穷,要刪表跑路的兄弟,請在訂票成功后在執(zhí)行操作藏雏!訂票電話:400-806-9553
可以這么理解拷况,一本書,delete是把目錄撕了掘殴,truncate是把書的內(nèi)容撕下來燒了赚瘦,drop是把書燒了
END
引用鏈接:blog.csdn.net/qq_39390545/article/details/107144859