【MySQL】MySQL刪除數據的過程是什么樣的?drop、truncate、delete什么區別?


參考文獻:

 

drop table

  • 這里先介紹一下【InnoDB】存儲表空間概念:

Innodb存儲引擎,可將所有的數據庫數據存放於【ibdata1】的共享表空間;也可以將每張表存放於獨立的.idb文件的獨立表空間

(共享表空間和獨立表空間都是針對數據的存儲方式而言的。)

1》共享表空間:某一個數據庫的所有表數據都存放在一個文件中,默認這個共享表空間的文件路徑在data目錄下。

  默認的文件名【ibdata1】,初始化為10M。

2》獨立表空間:每一個表都將會生成以獨立的文件方式來進行存儲,每一個表都有一個【.frm】表描述文件,還有一個【.ibd】文件。

  其中這個文件包括了單獨一個表的數據內容以及索引內容,默認情況下它的存儲位置也是在表的位置之中。

 

  • 在【mysql】配置文件中有一個參數【innodb_file_per_table】,可以用來控制【innodb】對於表數據的存儲規則。
1》設置為ON:表示為每個innodb的表數據存在一個單獨的【.idb】文件中。
在【drop table】的時候系統就會直接刪除【.idb】文件,系統磁盤空間自然就釋放了。
2》設置為OFF:表示為所有表數據存放在系統共享表空間中,也就是跟數據字典放在一起。

 

  • 共享表空間和獨立表空間的優缺點比較:

    • 共享表空間

優點:可以將表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小限制,如一個表可以分布在不同的文件上)。數據和文件在一起方便管理

缺點:對於統計分析、日志系統這類應用不適合用共享表空間,因為多個表及索引在表空間混合,大量刪除操作后會造成大量空間間隙。

    • 獨立表空間

優點:

1》每個表都有自己的獨立空間

2》每個表的數據和索引都存在自己的獨立空間

3》可以實現表在不同的數據庫中移動

4》空間可以回收:

a.【drop table】可以自動回收表空間

b.刪除大量數據后,可通過指令【alter table [tablename] engine=innodb】重建表,來回縮空間

c.對於【innodb-plugin 的 innodb】,使用指令【turncate table】也會使空間收縮

d.獨立空間表的使用,表空間的隨便不會太影響全局性能,也方便處理

 

  • 現在我們可以說說【drop table】方式刪除數據:
drop table #操作會刪除所有表數據以及結構

 

truncate table

會清空表中所有的數據,速度快,不可回滾;實質是刪除整張表包括數據再重新創建表;

 

delete table

逐行刪除數據,每步刪除都是有日志記錄的,可以回滾數據;實質是逐行刪除表中的數據;

 

  • 數據的刪除流程:

1》MySQL在刪除一條記錄的時候,只是把這行記錄標記為刪除,但不會回收磁盤空間,被標記刪除的位置可以被復用;

2》所以說【delete】命令只是把記錄的位置或者數據頁標記為【可復用】,但磁盤大小不會改變。這些可復用而沒有使用的空間,看起來像個【空洞】。

 

  • 所以此時可能會出現表空間不釋放的問題

不止刪除會造成數據空洞,插入數據也會,如果數據是隨機插入的,就可能會造成索引的數據頁分裂。

  

上圖是一個分裂前的B+Tree,此時B+Tree分裂后:

 

  • 重建表可以解決存在很多【空洞】的問題,從而收縮空間
alter table A engine = InnnDB  #可以重建表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM