<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官靈魂一問: MySQL 的 delete、truncate、drop 有什么區(qū)別?

          共 2844字,需瀏覽 6分鐘

           ·

          2020-10-28 13:59

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


          • 一、從執(zhí)行速度上來說
          • 二、從原理上講
            • 1、DELETE
            • 2、truncate
            • 3、drop

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

          那你是怎么刪除的?

          “delete from table 呀”

          “怪不得,其實(shí)要?jiǎng)h除MySQL數(shù)據(jù)是有好幾種方式的,有些場景下是不應(yīng)該用DELETE的,比如你這種情況。好了,讓我來給你講一下吧。”


          MySQL刪除數(shù)據(jù)的方式都有哪些?

          咱們常用的三種刪除方式:通過 delete、truncate、drop 關(guān)鍵字進(jì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),會走事務(wù),執(zhí)行時(shí)會觸發(fā)trigger;

          2、在 InnoDB 中,DELETE其實(shí)并不會真的把數(shù)據(jù)刪除,mysql 實(shí)際上只是給刪除的數(shù)據(jù)打了個(gè)標(biāo)記為已刪除,因此 delete 刪除表中的數(shù)據(jù)時(shí),表文件在磁盤上所占空間不會變小,存儲空間不會被釋放,只是把刪除的數(shù)據(jù)行設(shè)置為不可見。 雖然未釋放磁盤空間,但是下次插入數(shù)據(jù)的時(shí)候,仍然可以重用這部分空間(重用 → 覆蓋)。

          3、 DELETE執(zhí)行時(shí),會先將所刪除數(shù)據(jù)緩存到rollback segement中,事務(wù)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 。所以要想達(dá)到釋放磁盤空間的目的,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í)行刪除的,并且同時(shí)將該行的的刪除操作日志記錄在redo和undo表空間中以便進(jìn)行回滾(rollback)和重做操作,生成的大量日志也會占用磁盤空間

          2、truncate

          Truncate?table?TABLE_NAME

          1、truncate:屬于數(shù)據(jù)庫DDL定義語言,不走事務(wù),原數(shù)據(jù)不放到 rollback segment 中,操作不觸發(fā) trigger。

          執(zhí)行后立即生效,無法找回 執(zhí)行后立即生效,無法找回 執(zhí)行后立即生效,無法找回

          2、 truncate table table_name 立刻釋放磁盤空間 ,不管是 InnoDB和MyISAM 。truncate table其實(shí)有點(diǎn)類似于drop table 然后creat,只不過這個(gè)create table 的過程做了優(yōu)化,比如表結(jié)構(gòu)文件之前已經(jīng)有了等等。所以速度上應(yīng)該是接近drop table的速度;

          3、truncate能夠快速清空一個(gè)表。并且重置auto_increment的值。

          但對于不同的類型存儲引擎需要注意的地方是:

          • 對于MyISAM,truncate會重置auto_increment(自增序列)的值為1。而delete后表仍然保持auto_increment。
          • 對于InnoDB,truncate會重置auto_increment的值為1。delete后表仍然保持auto_increment。但是在做delete整個(gè)表之后重啟MySQL的話,則重啟后的auto_increment會被置為1。

          也就是說,InnoDB的表本身是無法持久保存auto_increment。delete表之后auto_increment仍然保存在內(nèi)存,但是重啟后就丟失了,只能從1開始。實(shí)質(zhì)上重啟后的auto_increment會從 SELECT 1+MAX(ai_col) FROM t 開始。

          4、 小心使用 truncate,尤其沒有備份的時(shí)候,如果誤刪除線上的表,記得及時(shí)聯(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 ,要?jiǎng)h表跑路的兄弟,請?jiān)谟喥背晒笤趫?zhí)行操作!訂票電話:400-806-9553

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


          END


          有熱門推薦?

          1.?后端必備 Git 分支開發(fā):規(guī)范指南

          2.?IntelliJ IDEA 15款 神級超級牛逼插件推薦(自用,真的超級牛逼)

          3.?23 個(gè)問題 TCP 疑難雜癥全解析

          4.?SQL 中的 in 與 not in、exists 與 not exists 的區(qū)別以及性能分析

          最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。

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

          瀏覽 84
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  香蕉视频啪啪啪 | 天天做天天爱天天爽 | 久热中文字幕无均码在线观看 | 色窝窝视频在线 | 欧美激情一区二区三区p站 |