MongoDB 3.6以後,預設使用的儲存引擎是 WiredTiger。這個引擎有一個特點,就是删除資料不釋放空間。例如現在你的一個集合裡面有10000000條資料,占用10GB 的硬碟空間。你把其中的9999999條資料都删了,占用空間仍然是10GB。
如果你想釋放空間,最直接的方法是删除整個集合(Drop Collection)或者删除整個資料庫(Drop Database)。
如果你的 MongoDB 版本小于4.4,但是大于等于3.6,那麼雖然删除了資料,磁盤空間不會釋放,但當你插入新的資料時,MongoDB 會重用之前占有的空間,而不會繼續額外占用新的磁盤空間。
例如你的集合有10GB,你删除了9999999條資料,接下來,在你新插入的資料總大小超過10GB 前,MongoDB 都不會申請額外的硬碟空間。
我們可以在 Robo 3T 上,通過檢視集合的統計資訊找到目前集合可重複使用的空間大小。在集合上右鍵,選擇
Statistics
,從傳回的統計資料中,展開
wiredTiger
-
block-manager
-
file bytes available for reuse
。這裡顯示的資料就是目前集合可重用的空間大小。如下圖所示。
如果你的 MongoDB 允許暫停讀寫操作,那麼還可以在 Robo 3T 或者 Mongo Shell 中使用
compact
指令來釋放空間。指令格式為:
db.runCommand({'compact': '集合名'})
在 MongoDB 4.4之前的版本,
compact
會阻塞整個庫的增删改查操作,是以需要暫停外部讀寫後才能執行。
在 MongoDB 4.4 或以後的版本,
compact
指令幾乎可以在除了删除集合、增删索引外的任何時候執行。