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

2021-01-10 素文宅博客

上周同事小姐姐問我:「哈哥你看,我發現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中如何刪除記錄?delete關鍵字了解一下
    在上一篇文章中我們學習了如何更新mysql中的數據內容,用到的是update這個關鍵字,今天我們要學習的是如何讓在mysql中刪除記錄,也就是從箱子裡面拿走東西,用到的關鍵字是delete這個關鍵字,下面我們就通過一個例子來了解一下。
  • 資料庫中 truncate與delete的區別你了解多少?
    要知道truncate和delete的區別,首先我們應該知道它們是什麼 truncate [/trket/],delete [/dlit/].一。語法:(1)truncate: TRUNCATE [TABLE] tbl_name 。
  • delete後加 limit是個好習慣麼 !
    比如,在刪除執行中,第一條就命中了刪除行,如果 SQL 中有 limit 1;這時就 return 了,否則還會執行完全表掃描才 return。效率不言而喻。那麼,在日常執行 delete 時,我們是否需要養成加 limit 的習慣呢?是不是一個好習慣呢?在日常的 SQL 編寫中,你寫 delete 語句時是否用到過以下 SQL?
  • MySQL性能優化
    mysql的慢查詢時間Show variables like 'long_query_time';修改mysql 慢查詢時間set long_query_time=2SQL語句優化-定位慢查詢問題是: 如何從一個大項目中,迅速的定位執行速度慢的語句
  • MySQL恢復delete的數據
    如果沒有完整的把資料庫或者表刪除掉,而僅僅是刪除了表裡的部分數據,比如本文探討的:delete命令數據誤刪恢復,這種情況應該發生的概率更大,畢竟有機會刪除庫和表的權限和命令通常控制的都很嚴(刪庫跑路是段子)。有人會有疑惑,用delete命令去刪除數據,不都是正常想刪除掉的麼,為何存在要恢復的情況。
  • MySQL中delete和update語句的用法
    昨天和大家分享學習了insert,今天我們一起學習一下刪除與更新,即delete和update的用法。SET 屬性名1=取值1, 屬性名2=取值2,…,屬性名n=取值nWHERE 條件表達式;2、刪除記錄語法:DELETE FROM 表名 [ WHERE 條件表達式 ] ;刪除記錄,也是一樣,需要加上where條件,不然則是將整個表格記錄全部刪除的;現在來實際敲幾個案例,先進入昨天的表格中:
  • MySQL怎麼刪除#sql開頭的臨時表
    2.注意: 此類表空間文件不能直接rm -f的方式物理刪除,因為該信息記錄在ibdata的共享表空間裡,直接刪除後,後續實例重啟時會出現錯誤。3. 處理方法3.1   同時存在.frm 和.ibd名稱相同的文件如果 #sql-*.ibd 和 #sql-*.frm兩個文件都存在數據目錄裡的話,可以直接drop table。
  • malloc/free與new/delete的區別
    malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。下面來看他們的區別。一、操作對象有所不同。
  • Win7系統如何禁用Ctrl+Alt+delete?
    Ctrl+Alt+delete這個組合鍵想必大家不會陌生,這個是用來打開任務管理器的,通常我們想查看系統後臺在運行哪些程序的時候,會使用它來進行查看。但是有些用戶不喜歡用這個組合鍵,想把它禁用了,卻不知如何進行。
  • 電子數據取證之MySQL資料庫刪除數據的恢復指南
    查看binlog日誌是否開啟,有以下三種方法方法一:打開MySQL資料庫的配置文件(windows系統中的配置文件為my.ini,一般在安裝目錄的根目錄下;Linux系統中配置文件為my.cnf,一般在/usr/local/mysql/etc/目錄下),在配置文件中查看log-bin=MySQL-bin有沒有被注釋掉(每行第一個字符為#號表示該行被注釋),若沒被注釋表示開啟
  • mysql指令、數據類型、表結構、約束學習記錄
    mysql常用口令--修改用戶密碼的命令mysqladmin -uroot -proot123 password mysql123--登錄mysql資料庫的命令mysql -uroot-proot123--顯示資料庫的命令show databases;--使用資料庫的命令use mysql;--顯示當前連接的資料庫select database
  • 為什麼MySQL不建議delete刪除數據
    我負責的有幾個系統隨著業務量的增長,存儲在MySQL中的數據日益劇增,我當時就想現在的業務方不講武德,搞偷襲,趁我沒反應過來把很多表,很快,很快啊都打到了億級別,我大意了,沒有閃,這就導致跟其Join的表的SQL變得很慢,對的應用接口的response time也變長了,影響了用戶體驗。
  • C/C++中常用的編程關鍵字
    關鍵字作用:關鍵字是C++中預先保留的單詞(標識符)在定義變量或者常量時候,不要用關鍵字C++關鍵字如下:在 C++ 中,用 const 聲明一個變量,意味著該變量就是一個帶類型的常量,可以代替 #define,且比 #define 多一個類型信息,且它執行內連結,可放在頭文件中聲明;但在 C 中,其聲明則必須放在源文件(即 .C 文件)中,在 C 中 const 聲明一個變量,除了不能改變其值外,它仍是一具變量。
  • Python連接MySQL資料庫方法介紹(超詳細!手把手項目案例操作)
    執行結果如下:('a', '趙大', '16')('b', '錢二', '16')mysql.connectormysql-connector-python:是MySQL官方的純Python驅動;mysql.connector安裝安裝pip install mysql查看版本pip show
  • macOSCatalina如何從「照片」中手動創建的相冊中刪除圖像
    macOS的最新版本Catalina有很多怪癖(說得很對)。當您處理手動創建的相冊時,其中一個會出現在「照片」中,這些相冊是您選擇要顯示圖像和視頻的相冊,而不是依賴於搜索條件的智能相冊。在Mojave和早期版本的macOS中,您可以在相冊中選擇一個或多個圖像,然後右鍵單擊以刪除X圖像,或使用菜單項 圖像>刪除X圖像。
  • 【轉載】深入理解 JavaScript 中的 delete 操作符
    似乎很多同學(包括我)對 delete 操作符都是似是而非,為什麼有的屬性可以被刪除,有的卻不能被刪除?為什麼能夠刪除對象的屬性卻不能刪除變量或函數?在 eval 和 嚴格模式下,delete 操作符又有哪些特性?等等。。本文將從基本概念到 ECMPScript 內部原理來學習 delete 操作符。
  • MySQL 5.7.11 版本發布
    而且由於5.7版本支持從低版本在線升級到該版本(在線GTID升級),這個進程會比5.5升級到5.6更快。站在開發人員的角度,怎麼樣讓用戶升級到最新的版本是一門大學問。比如Inside君主導的InnoSQL,如何讓用戶升級到最新版本的InnoSQL一直很是頭疼。站在運維的角度,系統的穩定性要遠高於新版本的新功能。但作為一名Geek,Inside君不知道堅持的意義何在。
  • 長線和短線有哪些區別?我該如何選擇來投資理財?
    在投資理財中,長線和短線區別是非常大的。不同的產品,不同的理財人群,選擇的策略也會截然不同。長線和短線有哪些區別?我該如何選擇來投資理財?但這其中有很多方面值得投資者注意,比如說一些理財產品是存在時間限制的。例如各式各樣的存款產品,對應的有很多的期限選擇。一個月、兩個月、三個月、半年、一年、三年等等。如果大家選擇的期限比較長,那麼這筆錢封閉的時間就會比較久。一般來說要到期滿之後才能將本息拿回來,當然有些急用錢也可以隨時取出,但利息有可能按活期來計算,就會很不划算。
  • MySQL如何計算統計redo log大小
    在MySQL中如何計算、統計重做日誌(redo log)的生成情況呢? 例如10分鐘內,生成了多少M的redo log呢?30分鐘內又生成了多少M的redo log.....。MySQL沒有像Oracle中那樣的系統視圖統計這些數據,但是我們可以通過一些方法曲線的統計二進位日誌的生成量。