一、MongoDB 權(quán)威指南
親身經(jīng)歷了在快速發(fā)展的大型互聯(lián)網(wǎng)公司應(yīng)于MySQL的過(guò)程。開(kāi)始
時(shí)只有很少的數(shù)據(jù),一臺(tái)服務(wù)器就可以了。然后就得建立備份,以便應(yīng)對(duì)大量
的讀取和不時(shí)的當(dāng)季。用不了多久,就得加一個(gè)緩存層,調(diào)整所有的查詢。
投入更多的硬件。
MongoDB是是一款強(qiáng)大、靈活、且易于擴(kuò)展的通用性數(shù)據(jù)庫(kù)。它能擴(kuò)展出
非常多的功能,如二級(jí)索引, 范圍查詢,排序,聚合,以及地理空間索引
縱向擴(kuò)展就是適用計(jì)算能力更強(qiáng)的機(jī)器,而橫向擴(kuò)展就是通過(guò)分區(qū)將
數(shù)據(jù)分散到更多的機(jī)器上。通常,縱向擴(kuò)展是最省力的做法,其缺點(diǎn)是大型機(jī)
一般都非常昂貴。而且,當(dāng)數(shù)據(jù)量達(dá)到機(jī)器的物理極限時(shí),無(wú)論話多少錢(qián)也買(mǎi)不到
更強(qiáng)的機(jī)器了。
另一個(gè)選擇是橫向擴(kuò)展;要增加存儲(chǔ)空間或提高性能,只需購(gòu)買(mǎi)一臺(tái)普通的服務(wù)器
并把它添加到集群中就可以了。
橫向擴(kuò)展的缺點(diǎn)就是,維護(hù)一個(gè)1000個(gè)集群的機(jī)器,比一個(gè)維護(hù)一個(gè)機(jī)器更麻煩。
二、為什么MongoDB 更易于橫向擴(kuò)展呢?
因?yàn)镸ongoDB 的主鍵不是自增的,所以不會(huì)有自增時(shí)候的限制。
并且使用類(lèi)似UUID的方式,更加適用于分布式存儲(chǔ)
這里需要研究下UUID的存儲(chǔ)
三、MongoDB 提供一個(gè)卓越的性能。
MongoDB的一個(gè)主要目標(biāo)是提供卓越的性能。這很大成都上決定了MongoDB的設(shè)計(jì)。
MongoDB能對(duì)文檔進(jìn)行動(dòng)態(tài)填充(dynamic padding),也能預(yù)分配數(shù)據(jù)文件以利用
額外的空間來(lái)?yè)Q取穩(wěn)定的性能。MongoDB把竟可能多的內(nèi)存做緩存(cache),
試圖在各方面都保持他的卓越性能。
四、MongoDB 不提供
MongoDB 不提供連接(join)和復(fù)雜的多行事務(wù)(multirow trasaction).
省略這些功能是出于架構(gòu)上的考慮,因?yàn)樵诜植际较到y(tǒng)中這兩個(gè)功能難以高效的實(shí)現(xiàn)
五、MongoDB 存儲(chǔ)的特點(diǎn)
文檔的鍵是字符串。
鍵不能含有\(zhòng)0(空字符串)。這個(gè)字符用于表示鍵的結(jié)尾
.和$具有特殊意義
MongoDB 的文檔不能有重復(fù)的鍵。下面的文檔就是非法的
{ "greeting": "Hello, world!", "greeting": "Hello, MongoDB!" }
- 文檔中的鍵/值對(duì)是有序的
{ "x": 1, "y": 2 } 與 { "y": 2, "x": 1 } 是不同的
六、MySQL 與 MongoDB 的映射
MySQL MongoDB
db(tables) db(collections)
table collection
record document
七、動(dòng)態(tài)模式
集合是動(dòng)態(tài)的。這意味著一個(gè)集合里面的文檔可以是各種各樣的。
例如,下面兩個(gè)文檔可以存儲(chǔ)在同一個(gè)集合里面
{ "greeting": "Hello, world!" }
{ "foo" : 5 }
但還是有必要設(shè)計(jì)多個(gè)集合
查詢簡(jiǎn)單。
磁盤(pán)尋道操作更少。
創(chuàng)建索引,使用文檔的附加結(jié)構(gòu)。一個(gè)集合中只放入一種類(lèi)型的文檔,可以更有效地
對(duì)集合進(jìn)行索引。
八、命名
集合不能出現(xiàn)以下情況
1、不能為空字符串
2、不能包含\0字符
3、不能以system.開(kāi)頭
4、不能包含$
九、子集合
組織集合的一種慣例是使用“.”分隔不同命名空間的自己合。
例如,一個(gè)具有博客功能的應(yīng)用可能包含兩個(gè)集合,分別是
blog.posts 和 blog.authors 這是為了使組織結(jié)構(gòu)更加清晰。
這里的blog集合(這個(gè)集合甚至不需要存在)跟它的子集合
沒(méi)有任何關(guān)系
十、數(shù)據(jù)庫(kù)命名限制
- 不能是空字符串。
- 不能還有特殊符號(hào), 可以使用- 或 _。數(shù)字或字母。
- 區(qū)分大小寫(xiě)。
- 最多64位。
如果要使用cms數(shù)據(jù)庫(kù)中的blog.posts集合,這個(gè)結(jié)合的命名空間
就是cms.blog.posts。命名空間的長(zhǎng)度不得超過(guò)121個(gè)字節(jié)
十一、MongoDB 啟動(dòng)
使用 mongod 啟動(dòng)
mongod 在沒(méi)有參數(shù)的情況下會(huì)適用默認(rèn)數(shù)據(jù)目錄/data/db。
如果數(shù)據(jù)目錄不存在或者不可寫(xiě),服務(wù)器會(huì)啟動(dòng)失敗。
MongoDB 監(jiān)聽(tīng)27017 端口。
MongoDB還會(huì)啟動(dòng)一個(gè)非?;镜腍TTP服務(wù)器,監(jiān)聽(tīng)數(shù)字比主
端口號(hào)高1000的端口,也就是28017 端口。這意味著,通過(guò)瀏覽器
訪問(wèn)http://localhost:28017 能獲取數(shù)據(jù)庫(kù)的管理信息。
十二、MongoDB shell簡(jiǎn)介
MongoDB 自帶JavaScript shell, 可在shell中適用命令行
能運(yùn)行任意JavaScript程序。
十三、MongoDB 的CRUD
- 創(chuàng)建
> post = {
"title" : "My Blog Post",
"content" : "Here1s my blog post",
"date" : new Date()
}
db.blog.insert(post)
- 查詢
> db.blog.find()
or
> db.blog.findOne()
- 更新
> post.comments = []
> db.blog.update({ title : "My Blog Post"}, post)
- 刪除
使用remove 方法可將文檔從數(shù)據(jù)庫(kù)中永遠(yuǎn)刪除。
如果沒(méi)有使用任何參數(shù),它將集合內(nèi)的所有文檔全部刪除。
它可以接受一個(gè)作為限定條件的文檔作為參數(shù)。
> db.blog.remove({title: "My Blog Post"})
十四、數(shù)據(jù)類(lèi)型
- null
{ "x" : null }
- 布爾型
{ "x" : true }
- 數(shù)值
{ "x" : 3.14 }
{ "x" : NumberInt("3")}
{ "x" : NumberLong("3") }
- 字符串
{ "x" : "foobar" }
- 日期
毫秒數(shù)
{ "x" : new Date() }
- 正則表達(dá)式
{ "x" : /foobar/i }
- 數(shù)組
{ "x": ["a", "b", "c"]}
- 內(nèi)嵌文檔
{"x": {"foo" : "bar"}}
- _id
{ "x" : ObjecteId() }
- 二進(jìn)制數(shù)據(jù)
所以可以存儲(chǔ)任何的文件
- 甚至代碼
{ "x" : function() { /* ... */ } }
參考 《MongoDB 權(quán)威指南》