MongoDB內(nèi)部有預(yù)分配空間的機制,每個預(yù)分配的文件都用0進行填充。
數(shù)據(jù)文件每新分配一次,它的大小都是上一個數(shù)據(jù)文件大小的2倍,每個數(shù)據(jù)文件最大2G。
MongoDB每個集合和每個索引都對應(yīng)一個命名空間,這些命名空間的元數(shù)據(jù)集中在16M的*.ns文件中,平均每個命名占用約 628 字節(jié),也即整個數(shù)據(jù)庫的命名空間的上限約為24000。
如果每個集合有一個索引(比如默認的_id索引),那么最多可以創(chuàng)建12000個集合。如果索引數(shù)更多,則可創(chuàng)建的集合數(shù)就更少了。同時,如果集合數(shù)太多,一些操作也會變慢。
要建立更多的集合的話,MongoDB 也是支持的,只需要在啟動時加上“--nssize”參數(shù),這樣對應(yīng)數(shù)據(jù)庫的命名空間文件就可以變得更大以便保存更多的命名。這個命名空間文件(.ns文件)最大可以為 2G。
每個命名空間對應(yīng)的盤區(qū)不一定是連續(xù)的。與數(shù)據(jù)文件增長相同,每個命名空間對應(yīng)的盤區(qū)大小都是隨分配次數(shù)不斷增長的。目的是為了平衡命名空間浪費的空間與保持一個命名空間數(shù)據(jù)的連續(xù)性。
需要注意的一個命名空間$freelist,這個命名空間用于記錄不再使用的盤區(qū)(被刪除的Collection或索引)。每當命名空間需要分配新盤區(qū)時,會先查看$freelist是否有大小合適的盤區(qū)可以使用,如果有就回收空閑的磁盤空間。