參考文獻:
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 #可以重建表