Posted on 2012-04-25 15:56
云云 閱讀(4964)
評論(0) 編輯 收藏
MongoDB 深入淺出
數(shù)據(jù)邏輯結(jié)構(gòu)
1 mongoDB中的文檔(document) 相當(dāng)于 關(guān)系性數(shù)據(jù)庫的一條一條的記錄
2 collection 相當(dāng)于關(guān)系性數(shù)據(jù)庫中的表,所以一個(gè)collection中有多個(gè)document
3 多個(gè)集合在邏輯上組成一起 就是database
4 一個(gè)mongoDB 和 關(guān)系性數(shù)據(jù)庫一樣 可以有多個(gè)數(shù)據(jù)庫(database)
與關(guān)系數(shù)據(jù)結(jié)構(gòu)比較
MongoDB |
關(guān)系性數(shù)據(jù)庫 |
文檔(document) |
行(row) |
集合(collection) |
表(table) |
Database |
Database |
數(shù)據(jù)存儲結(jié)構(gòu)
MongoDB 默認(rèn)的數(shù)據(jù)目錄是data/db,它負(fù)責(zé)存儲所有mongodb的數(shù)據(jù)文件,在mongoDB中每個(gè)數(shù)據(jù)庫都包含一個(gè).ns和一些數(shù)據(jù)文件,而且這些數(shù)據(jù)文件會隨著數(shù)據(jù)的增多越來越多,則: 如果系統(tǒng)中有一個(gè)叫foo的數(shù)據(jù)庫,那么構(gòu)成foo這個(gè)數(shù)據(jù)庫的文件就會有foo.ns ,foo.0,foo1,foo.2等。
Mongodb內(nèi)部有預(yù)分配空間的機(jī)制,每個(gè)預(yù)分配的文件都用0填充,由于有了這個(gè)機(jī)制,
mongoDB始終保存額外的空間和空閑的文件,這對系統(tǒng)數(shù)據(jù)突然暴增時(shí)減緩磁盤壓力有很大好處.
由于數(shù)據(jù)量的不斷增加,mongoDB每新分配一次,大小都會是上一個(gè)文件大小的2倍,最大2G.這種機(jī)制保證系統(tǒng)數(shù)據(jù)較小時(shí) 不會浪費(fèi)太多空間,系統(tǒng)數(shù)據(jù)較多時(shí) 也有相應(yīng)預(yù)留空間。
mongoDB命名空間
每張表都有命名空間,每個(gè)索引也有對應(yīng)的命名空間,這些命令空間的元數(shù)據(jù)都存在.ns文件中
在下圖中,foo數(shù)據(jù)庫包含3個(gè)文件存儲數(shù)據(jù)與索引,foo.2文件屬于預(yù)分配文件,foo.0和foo.1被分配到了相應(yīng)的盤區(qū)對應(yīng)不同的名字空間。
從上圖可以看出,每個(gè)命名空間可以包含多個(gè)不同的盤區(qū),這些盤區(qū)并不是連續(xù)的,與數(shù)據(jù)增長一樣,每一個(gè)命名空間的盤區(qū)大小也隨著分配的次數(shù)不斷增長。在上圖有個(gè)foo.$freelist命名空間,這個(gè)命名空間用于記錄不再使用的盤區(qū)(如被刪除的collection或索引),每當(dāng)命名空間需要分配新的盤區(qū)時(shí),就會檢查.$freelist是否有合適大小的空間,這樣就可以回收空閑的磁盤空間了。