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

      網友投稿 939 2025-04-03

      點擊▲?“Java編程鴨”關注并標星

      更多精彩 第一時間直達

      上周同事小姐姐問我:“哈哥你看,我發現MySQL有bug,我下午為了清理磁盤,明明刪除了100萬條MySQL數據,磁盤不僅沒有變小,反而更滿了呢??”

      那你是怎么刪除的?

      “delete from table 呀”

      “怪不得,其實要刪除MySQL數據是有好幾種方式的,有些場景下是不應該用DELETE的,比如你這種情況。好了,讓我來給你講一下吧。”

      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 然后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 開始。

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

      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 ,要刪表跑路的兄弟,請在訂票成功后在執行操作!

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

      來源:https://blog.csdn.net/qq_39390545/article/details/107144859

      END

      看完本文有收獲?請轉發分享給更多人關注「Java編程鴨」,提升Java技能關注Java編程鴨微信公眾號,后臺回復:碼農大禮包?可以獲取最新整理的技術資料一份。涵蓋Java?框架學習、架構師學習等!

      文章有幫助的話,在看,轉發吧。

      謝謝支持喲 (*^__^*)

      MySQL 數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:項目管理費用是多少
      下一篇:出入庫管理系統
      相關文章
      亚洲裸男gv网站| 亚洲熟妇AV日韩熟妇在线| 亚洲精品无码中文久久字幕| 亚洲第一香蕉视频| 久久亚洲国产成人精品性色| 亚洲国产精品无码专区在线观看| 亚洲国产婷婷综合在线精品| 九月婷婷亚洲综合在线| 亚洲AV无码XXX麻豆艾秋| 亚洲色成人网站WWW永久四虎| 亚洲人成片在线观看| 亚洲免费人成视频观看| 亚洲国产精品午夜电影| 亚洲一区二区三区精品视频| 亚洲国产精品线观看不卡| 亚洲一区二区三区免费在线观看| 亚洲欧洲自拍拍偷午夜色| 337p日本欧洲亚洲大胆色噜噜| 亚洲一区免费观看| 在线观看亚洲人成网站| 亚洲国产精品久久人人爱| 国产成人精品亚洲日本在线| 亚洲人成图片网站| 亚洲JIZZJIZZ妇女| 日韩亚洲综合精品国产| 亚洲国产精品成人一区| 国产精品亚洲不卡一区二区三区 | 亚洲男人的天堂在线va拉文| 亚洲AV无码乱码精品国产| 亚洲国产一区视频| 亚洲夜夜欢A∨一区二区三区| 国产成人精品日本亚洲网站| 亚洲邪恶天堂影院在线观看| 中文字幕亚洲综合久久2| 亚洲人成电影在线观看网| 中文字幕亚洲码在线| 亚洲av无码专区在线观看亚| 亚洲福利精品一区二区三区| 在线A亚洲老鸭窝天堂| 亚洲AV永久无码精品水牛影视| 亚洲精品福利视频|