MySQL 中 delete、truncate、drop 關鍵字的區別有哪些,該如何選擇?

2021-01-08 素文宅博客

上周同事小姐姐問我:「哈哥你看,我發現MySQL有bug,我下午為了清理磁碟,明明刪除了100萬條MySQL數據,磁碟不僅沒有變小,反而更滿了呢??」那你是怎麼刪除的?「delete from table 呀」「怪不得,其實要刪除MySQL數據是有好幾種方式的,有些場景下是不應該用DELETE的,比如你這種情況。好了,讓我來給你講一下吧。」

MySQL刪除數據的方式都有哪些?

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

一、從執行速度上來說

drop > truncate >> DELETE

二、從原理上講

1、DELETE

DELETEfrom TABLE_NAME where xxx1)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)

selectconcat(round(sum(DATA_LENGTH/1024/1024),2),'M') as table_size from information_schema.tables where table_schema='csjdemo'AND table_name='demo2';

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

optimizetable demo2

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

7)delete 操作是一行一行執行刪除的,並且同時將該行的的刪除操作日誌記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,生成的大量日誌也會佔用磁碟空間。

2、truncate

Truncatetable TABLE_NAME1)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,尤其沒有備份的時候,如果誤刪除線上的表,記得及時聯繫我國民航,哈哈,開玩笑啦!!此操作一定慎重。

3、drop

Droptable Tablename1)drop:屬於資料庫DDL定義語言,同Truncate;

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

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

3)小心使用 drop ,要刪表跑路的兄弟,請在做好跑路準備後在執行操作,辦錯事是要付出代價的,謹慎操作!

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

作者:_陳哈哈blog.csdn.net/qq_39390545/article/details/107144859

相關焦點

  • 面試官靈魂一問:MySQL 的 delete、truncate、drop 有什麼區別?
    「delete from table 呀」「怪不得,其實要刪除MySQL數據是有好幾種方式的,有些場景下是不應該用DELETE的,比如你這種情況。好了,讓我來給你講一下吧。」MySQL刪除數據的方式都有哪些?
  • 新手入門MYSQL資料庫命令大全
    一、命令行連接資料庫Windows作業系統進入CMD命令行,進入mysql.exe所在目錄,運行命令mysql.exe -h主機名 -u用戶名 -p密碼注意:參數名與值之間沒有空格 , 如:-h127.0.0.1
  • 工作中,我們經常用到哪些SQL語句呢?
    如果有不全或者錯誤的也歡迎大家指正。語句truncate語句和delete語句一樣都是用來刪除表中數據,但是兩者是有區別的,使用truncate語句是沒有條件的刪除,可以把表中數據全部刪除,truncate刪除表中數據的速度比delete快① 語法truncate table table_name;② 舉例:刪除商品信息表中全部數據truncate table productinfo
  • MySQL怎麼刪除#sql開頭的臨時表
    2.注意: 此類表空間文件不能直接rm -f的方式物理刪除,因為該信息記錄在ibdata的共享表空間裡,直接刪除後,後續實例重啟時會出現錯誤。3.處理方法3.1   同時存在.frm 和.ibd名稱相同的文件如果 #sql-*.ibd 和 #sql-*.frm兩個文件都存在數據目錄裡的話,可以直接drop table。但注意刪除時候表名的變化。
  • 英語中的「掉落」fall,drop 的區別(動詞辨析28)
    文/陳德永英語中,fall 和 drop 均有「掉落」的意思,他們的區別是:fall 從高處墜落而下,是不及物動詞;也可以做連繫動詞,意為「變得,進入某種狀態drop 表示物體由高處落到低處,此時是不及物動詞;讓物體落向低處,是及物動詞。如:He didn't know if he would drop English. 他當時不知道是否該放棄英語。
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    引言讀寫分離要做的事情就是對於一條SQL該選擇哪個資料庫去執行,至於誰來做選擇資料庫這件事兒,無非兩個,要麼中間件幫我們做,要麼程序自己做。因此,一般來講,讀寫分離有兩種實現方式。第一種是依靠中間件(比如:MyCat),也就是說應用程式連接到中間件,中間件幫我們做SQL分離;第二種是應用程式自己去做分離。
  • 鋼結構遊泳池有哪些設備?該如何選擇?
    鋼結構泳池動力系統循環過濾系統,主要通過水循環作用,將遊泳池內的雜質排出,淨化泳池內的水,並且可以去除藻類和水中的漂浮物等雜質,濾砂池系統和無機房一體化濾池設備系統,兩者的主要區別是後者不需要機房鋼結構遊泳池廠家建議經營者可根據實際情況做出選擇。
  • 如何設置Twitter關鍵字定位?
    通過Twitter關鍵字定位,企業可以根據Twitter搜索中的關鍵字、最近的Tweets和最近使用的Tweets,利用Twitter關鍵字來吸引Twitter上的用戶。在"受眾特徵"部分下,單擊"全部",然後選擇"關鍵字"3.
  • 教你如何提高關鍵詞密度,防範關鍵字堆砌?
    如何區分關鍵字與關鍵詞關鍵字可以是一個單字或包含這個字的一個詞。搜索者在查找信息時,這兩種方式均有用到。一般的規則是,關鍵詞越長,從搜尋引擎索引中返回的信息也就越精確。有關鍵字密度公式嗎沒有一成不變的關鍵字公式,但將關鍵字與頁面總字數的比例控制在5%以下,可能是最好的做法。
  • Java 面試如何坐等 offer?
    7.java 中操作字符串都有哪些類?它們之間有什麼區別?8.String str="i"與 String str=new String("i")一樣嗎?9.如何將字符串反轉?10.String 類的常用方法都有那些?
  • 為什麼MySQL不建議使用delete刪除數據?
    插入原表中無效的數據(需要跟開發同學確認數據保留範圍)create table tbl_p201808 as select * from ota_order where create_time between '2018-08-01 00:00:00' and '2018-08-31 23:59:59';#3.
  • MySQL 工作、底層原理,看這一篇就夠了!
    首先程序的請求會通過mysql的connectors與其進行交互,請求到處後,會暫時存放在連接池(connection pool)中並由處理器(Management Serveices & Utilities)管理。當該請求從等待隊列進入到處理隊列,管理器會將該請求丟給SQL接口(SQL Interface)。
  • 隱形矯正與傳統矯正有哪些區別?該如何選擇呢?
    面對傳統矯正和隱形矯正,不少人犯了難,因為對這兩種方式都不甚了解,更不知道二者之間有什麼區別。在後臺也收到很多私信,問應該如何選擇矯正方式。今天的文章將通過對比兩種矯正方式的不同,來幫大家深入了解這兩種方式,希望對選擇矯正方式有所幫助。
  • MySQL進階之路:日期類型datetime和timestamp區別在哪裡?
    我以前學習的時候曾經參考過網上的一些文章,不過許多文章基本都是抄來抄去,回答的要麼有問題要麼不全面。而本文的目的就是,希望通過本文就能讓大家搞清楚搞明白他們的區別,不用再去網上翻來覆去地查資料了。這裡有一個點需要注意,就是在MySQL5.6.4之前,這兩個是都表示不了小數的。二、不同點接下來來說下他們的不同點。
  • 30個實用的搜尋引擎優化關鍵字排名工具
    結果出來後,您還可以通過選擇關鍵字將它們與其他網站和頁面的排名進行比較。這聽起來像是我們前三名所做的,但關鍵的區別是,你必須等待SEMrush完成對你的網站或頁面的分析,然後手動選擇每個關鍵字。前面提到的其他人用更少的精力完成所有這些工作,您將能夠在一個結果頁面上看到所有關鍵字的結果。要獲得詳細的數據,你需要每月支付大約70美元。
  • MySQL主從複製高級進階
    延時從庫介紹及配置SQL線程延時:數據已經寫入relaylog中了,SQL線程稍後執行。在5.7版本中,設置master_delay後,可以只停止sql_thread線程。即stop slave sql_thread,這樣從庫就不會清空relay log並重新拉取主庫binlog了。這樣可以節省一些網絡流量和IO資源。
  • MySQL基於MHA的FailOver過程
    MHA FailOver過程詳解什麼是FailOver故障轉移主庫宕機,一直到業務恢復正常的處理過程如何處理FailOver1.快速監控到主庫宕機2.選擇新主節點,選擇策略mysqladmin ping檢查資料庫狀態,主機狀態,埠等,判斷從庫節點讀取的master_log_file及read_master_log_pos節點大小,查看Retrieved_gtid_set(已接收到的gtid大小),executed_gtid_set(已執行的
  • mysql-proxy資料庫中間件架構 | 架構師之路
    所以說,根本上,mysql-proxy是一個官方提供的框架,具備良好的擴展性,可以用來完成:sql攔截與修改性能分析與監控讀寫分離請求路由...這個框架提供了6個hook點,能夠讓用戶能夠動態的介入到client與server中的通訊中去。