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