1.爲何要使用mongodb數據庫或者說他有什麼優勢? 高性能,高可用,易擴展,豐富的查詢語言,面向文檔html
2.文檔 至關於 行,鍵只能是字符串類型node
數據庫 -》集合-》文檔-》鍵,值 db col doc 查找數據庫某個集合的全部文檔 db.col.find()sql
刪除數據庫某個集合的全部文檔 db.col.remove({})mongodb
刪除某個文檔,name屬性值爲sandy的文檔 db.col.remove({"name":"sandy"})數據庫
3.數據庫bash
一個文檔
product_id : 1
version: 1.0
測試:
err = collection.Find(bson.M{"product_id": "2"}).All(&versions)
i := len(versions)
結果:
err = nil i=0 All函數找不到符合的
複製代碼
4.兩個文檔併發
product_id : 1
version: 1.0
product_id : 1
version: 1.1
測試:
err = collection.Find(bson.M{"product_id": "1"}).One(&versions)
結果:
不會報錯,只會返回其中一個文檔
複製代碼
5.兩個文檔函數
product_id : 1
version: 1.0
product_id : 1
version: 1.1
測試:
err = collection.Find(bson.M{"product_id": "2"}).All(&versions)
結果:
不會報錯,數量爲0
複製代碼
總結:想知道數據庫有沒有這個數據,使用Count(),爲0的話表明沒有這個數,不存在
性能
MongoDB的事務
首先咱們須要知道MongoDB是有多種存儲引擎的,不一樣的存儲引擎在實現ACID的時候,使用不一樣的機制。而Mongodb從3.0開始默認使用的是WiredTiger引擎,本文後續全部文字均是針對WiredTiger引擎。 WiredTiger引擎能夠針對單個文檔來保證ACID特性,可是當須要操做多個文檔的時候沒法保證ACID,也即沒法提供事務支持測試
Mongodb使用讀寫鎖來來控制併發操做:
當進行讀操做的時候會加讀鎖,這個時候其餘讀操做能夠也得到讀鎖。可是不能或者寫鎖。 當進行寫操做的時候會加寫鎖,這個時候不能進行其餘的讀操做和寫操做。 因此按照這個道理,是不會出現同時修改同一個文檔(如執行++操做)致使數據出錯的狀況並且按照這個道理,由於寫操做會阻塞讀操做,因此是不會出現髒讀的
【索引】 數據庫索引的本質是空間換時間
上文說過通常使用磁盤I/O次數評價索引結構的優劣。先從B-Tree分析,根據B-Tree的定義,可知檢索一次最多須要訪問h個節點。數據庫系統的設計者巧妙利用了磁盤預讀原理,將一個節點的大小設爲等於一個頁,這樣每一個節點只須要一次I/O就能夠徹底載入。爲了達到這個目的,在實際實現B-Tree還須要使用以下技巧:
每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁裏,加之計算機存儲分配都是按頁對齊的,就實現了一個node只需一次I/O。
B-Tree中一次檢索最多須要h-1次I/O(根節點常駐內存),漸進複雜度爲O(h)=O(logdN)。通常實際應用中,出度d是很是大的數字,一般超過100,所以h很是小(一般不超過3)。(h表示樹的高度 & 出度d表示的是樹的度,即樹中各個節點的度的最大值)
綜上所述,用B-Tree做爲索引結構效率是很是高的。
而紅黑樹這種結構,h明顯要深的多。因爲邏輯上很近的節點(父子)物理上可能很遠,沒法利用局部性,因此紅黑樹的I/O漸進複雜度也爲O(h),效率明顯比B-Tree差不少。
上文還說過,B+Tree更適合外存索引,緣由和內節點出度d有關。從上面分析能夠看到,d越大索引的性能越好,而出度的上限取決於節點內key和data的大小:
dmax=floor(pagesize/(keysize+datasize+pointsize))
floor表示向下取整。因爲B+Tree內節點去掉了data域,所以能夠擁有更大的出度,擁有更好的性能。
複製代碼
B樹
一棵m階的B-Tree有以下特性:
1. 每一個節點最多有m個孩子。
2. 除了根節點和葉子節點外,其它每一個節點至少有Ceil(m/2)個孩子。
3. 若根節點不是葉子節點,則至少有2個孩子
4. 全部葉子節點都在同一層,且不包含其它關鍵字信息
5. 每一個非終端節點包含n個關鍵字信息(P0,P1,…Pn, k1,…kn)
6. 關鍵字的個數n知足:ceil(m/2)-1 <= n <= m-1
7. ki(i=1,…n)爲關鍵字,且關鍵字升序排序。
8. Pi(i=1,…n)爲指向子樹根節點的指針。P(i-1)指向的子樹的全部節點關鍵字均小於ki,但都大於k(i-1)
複製代碼
B+樹
B+Tree相對於B-Tree有幾點不一樣:
非葉子節點只存儲鍵值信息。
全部葉子節點之間都有一個鏈指針。
數據記錄都存放在葉子節點中
複製代碼