欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

delete、truncate、drop的區(qū)別以及該如何選擇

 更新時間:2020年11月06日 14:27:58   作者:_陳哈哈  
這篇文章主要給大家介紹了關于delete、truncate、drop的區(qū)別以及該如何選擇的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

那你是怎么刪除的?

“delete from table 呀”

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

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

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

一、從執(zhí)行速度上來說

drop > truncate >> DELETE

二、從原理上講

1、DELETE

DELETE from TABLE_NAME where xxx

1、DELETE屬于數(shù)據(jù)庫DML操作語言,只刪除數(shù)據(jù)不刪除表的結構,會走事務,執(zhí)行時會觸發(fā)trigger;

2、在 InnoDB 中,DELETE其實并不會真的把數(shù)據(jù)刪除,mysql 實際上只是給刪除的數(shù)據(jù)打了個標記為已刪除,因此 delete 刪除表中的數(shù)據(jù)時,表文件在磁盤上所占空間不會變小,存儲空間不會被釋放,只是把刪除的數(shù)據(jù)行設置為不可見。雖然未釋放磁盤空間,但是下次插入數(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

再看看這張表的大小,就只剩下表結構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)化,比如表結構文件之前已經(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仍然保存在內存,但是重啟后就丟失了,只能從1開始。實質上重啟后的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 語句將刪除表的結構被依賴的約束(constrain)、觸發(fā)器(trigger)、索引(index);  依賴于該表的存儲過程/函數(shù)將保留,但是變?yōu)?invalid 狀態(tài)。

3、小心使用 drop ,要刪表跑路的兄弟,請在訂票成功后在執(zhí)行操作!訂票電話:400-806-9553

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

總結

到此這篇關于delete、truncate、drop的區(qū)別及該如何選擇的文章就介紹到這了,更多相關delete、truncate、drop區(qū)別及選擇內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL查詢數(shù)據(jù)(單表查詢)詳解

    MySQL查詢數(shù)據(jù)(單表查詢)詳解

    這篇文章主要介紹了MySQL查詢數(shù)據(jù)(單表查詢)的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • MySQL基礎學習之字符集的應用

    MySQL基礎學習之字符集的應用

    這篇文章主要為大家詳細介紹了MySQL中字符集的相關使用,例如字符集的查詢與修改和比較規(guī)則等,文中的示例代碼講解詳細,需要的可以參考一下
    2023-05-05
  • Mysql數(shù)據(jù)庫百萬級數(shù)據(jù)測試索引效果

    Mysql數(shù)據(jù)庫百萬級數(shù)據(jù)測試索引效果

    這篇文章主要為大家介紹了Mysql數(shù)據(jù)庫百萬數(shù)據(jù)測試索引效果,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • MySQL 實用命令

    MySQL 實用命令

    對于剛接觸到mysql的朋友,需要的了解下,mysql的一些小技巧。
    2009-03-03
  • Mysql:The user specified as a definer (''xxx@''%'') does not exist的解決方案

    Mysql:The user specified as a definer (''xxx@''%'') does not

    今天小編就為大家分享一篇關于Mysql:The user specified as a definer ('xxx@'%') does not exist的解決方案,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • MySQL Innodb關鍵特性之插入緩沖(insert buffer)

    MySQL Innodb關鍵特性之插入緩沖(insert buffer)

    這篇文章主要介紹了MySQL Innodb關鍵特性之插入緩沖的相關資料,幫助大家更好的理解和學習使用Innodb存儲引擎,感興趣的朋友可以了解下
    2021-04-04
  • mysql遠程登錄出錯的解決方法

    mysql遠程登錄出錯的解決方法

    mysql遠程登錄出錯的情況,先比很多朋友都有遇到過吧,下面有個不錯的解決方法,大家可以參考下
    2014-01-01
  • mysql表物理文件被誤刪的解決方法

    mysql表物理文件被誤刪的解決方法

    最近因為失誤不小心誤刪了mysql表的物理文件,這個時候該怎么辦呢?然后抓緊從網(wǎng)上找解決的方法,終于解決了,現(xiàn)在將解決的方法及過程分享給大家,有需要的朋友們可以參考借鑒,感興趣的朋友們下面來一起學習學習吧。
    2016-11-11
  • windows-mysql8.0.15如何修改密碼、重置密碼

    windows-mysql8.0.15如何修改密碼、重置密碼

    本文詳細介紹了在Windows環(huán)境下,如何修改或重置MySQL 8.0.15版本的用戶密碼,首先,需要停止MySQL服務并以管理員權限打開cmd窗口,然后開啟跳過密碼驗證的MySQL服務,接著,通過新的命令窗口登錄MySQL,并選擇相應的數(shù)據(jù)庫進行密碼修改或重置
    2024-10-10
  • MySQL中IF語句的基礎及進階用法

    MySQL中IF語句的基礎及進階用法

    在Mysql數(shù)據(jù)庫中實現(xiàn)判斷功能有很多方式,具體又分為函數(shù)和if語句形式,下面這篇文章主要給大家介紹了關于MySQL中IF語句的基礎及進階用法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01

最新評論