一圖勝千言mongodb
MongoDB 裏刪除一個集合裏全部文檔,有兩種方式url
db.collection.remove({}, {multi: true})
,逐個文檔從 btree 裏刪除,最後全部文檔被刪除,但文件物理空間不會被回收db.collection.drop()
刪除集合的物理文件,空間當即被回收總的來講,remove 會產生邏輯的空閒空間,這些空間能當即用於寫入新數據,但文件佔用的總物理空間不會當即回收;一般只要持續在寫入數據,有物理空間碎片問題並不大,不須要去 compact 集合,有的場景,remove 了大量的數據後,後續的寫入可能並很少,這時若是想回收空間,就須要顯式的調用 compact。spa
compact 一個集合,會加集合所在DB的互斥寫鎖,會致使該DB上全部的讀寫請求都阻塞;由於 compact 執行的時間可能很長,跟集合的數據量相關,因此強烈建議在業務低峯期執行,避免影響業務。3d
Compact 動做最終由存儲引擎 WiredTiger 完成,WiredTiger 在執行 compact 時,會不斷將集合文件後面的數據往前面空閒的空間寫,而後逐步 truancate 文件回收物理空間。每一輪 compact 前,WT 都會先檢查是否符合 comapact 條件。code
若是上面都不知足,說明執行compact確定沒法回收10%的物理空間,此時 compact 就回退出。因此有時候遇到對一個大集合進行 compact,compact立馬就返回ok,集合的物理空間也沒有變化,就是由於 WiredTiger 認爲這個集合沒有 compact 的必要。blog
The amount of empty space available for reuse by WiredTiger is reflected in the output of db.collection.stats() under the heading wiredTiger.block-manager.file bytes available for reuse
.rem
mymongo:PRIMARY> db.coll.stats().wiredTiger["block-manager"]["file bytes available for reuse"] 5033984
執行前請確保你已經讀懂了上面的內容,知道compact命令的原理、影響文檔
// compact somedb.somecollection use somedb db.runCommnd({compact: "somecollection"}) // compact oplog,在副本集primary上執行須要加 force 選項 use local db.runCommnd({compact: "somecollection", force: true})
閱讀原文get
本文爲雲棲社區原創內容,未經容許不得轉載。cmd