關於MongoDB的簡單理解(一)–基礎篇
一、什麼是MongoDB?
- MongoDB是一個基於分散式文件存儲的文檔資料庫,旨在簡化開發和擴展,為WEB應用提供可擴展的高性能數據存儲解決方案。
- MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。
二、為什麼要了解MongoDB?
- 具有良好的伸縮性,在高負載的情況下,添加更多的節點,可以保證伺服器性能(關係型資料庫伸縮困難)。
- 數據模型直觀,且它支援的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的數據類型。
- 支援多種存儲引擎且查詢語言豐富,可以方便的進行數據的增刪改查。
- 可用性高,MongoDB的複製工具(稱為副本集)提供了自動故障轉移、數據冗餘等功能。
三、MongoDB的關鍵特性
本文要介紹的MongoDB關鍵特性主要包含以下內容
- 文檔數據模型
- ad hoc查詢
- 索引
- 複製
- 加速與持久化
- 伸縮
3.1 文檔數據模型
官方概述:
資料庫很大程度上是由其數據模型定義的,MongoDB的數據模型是面向文檔的。
MongoDB中的記錄是一個文檔,它是由欄位和值對組成的數據結構。MongoDB文檔類似於JSON對象。欄位的值可以包括其他文檔,數組和文檔數組。
文檔的優點:
- 文檔(即對象)對應於許多程式語言中的本機數據類型。
- 嵌入式文檔和數組減少了對昂貴連接的需求。
- 動態模式支援流暢的多態性。
注意事項:
MongoDB以二進位JSON格式存儲文檔數據,或者叫做BSON。BSON有相似的數據結構,是專門為文檔存儲設計。當我們查詢Mongo並返回結果的時候,這些數據會轉化為易於閱讀的數據格式。
關係資料庫中包含表,MongoDB擁有集合。換句話說,Mysql、Oracle等關係型資料庫在表的行里保存數據,而MongoDB在集合的文檔里保存數據(集合類似於表)。
MongoDB的集合中的數據存儲在硬碟上,而且大部分查詢需要指定查詢的目標集合。
3.2 ad hoc查詢
概述:
ad hoc queries(主動查詢模式,也有翻譯為「即席查詢」的)是指不需要事先定義系統接收何種查詢。
舉例說明:
以關係型資料庫來說,假設A表存儲了整個醫院門診患者的基本資訊,B表存儲了患者的挂號資訊,如果想查詢張三醫生接診的年齡大約50的患者資訊。
SELECT * FROM A LEFT JOIN B ON A.pat_no = B.pat_no WHERE A.age > 50 AND B.doctor = '張三';
等價的MongoDB查詢,使用document文檔作為匹配器。($gt:大於)
db.A.find({'doctor': '張三', 'age': {'$gt', 50}});
注意:
關係型資料庫查詢依賴於嚴格的範式模型,數據分別存放在A、B兩張表中,MongoDB假設數據都存在每個A集合中。
以上兩種方式都演示了任意組合屬性的功能,這也是ad hoc查詢的功能。
3.3 索引
創建索引原因:
隨著資料庫中添加的文檔數量約來越多,查詢的成本會變得約來越高,有時無異於大海撈針。
使用索引的好處:
索引類似於圖書的目錄,我們可以通過目錄,快速查找想要知道的內容。
MongoDB的索引:
MongoDB中的索引使用了B-樹(平衡樹)數據結構,B-樹索引也大量使用於許多關係型資料庫中。
使用MongoDB,每個集合我們可以創建64個索引,例如升序、降序、複合鍵、哈希、文本以及地理空間索引等
3.4 複製
概述:
Mongo提供了資料庫的複製特性,叫做可複製結合(replica set)。
MongoDB如何保證複製:
在多個機器上分散式存儲數據,當伺服器或網路出錯時,實現數據冗餘存取和自動災備。
與其他資料庫主從複製類似,可複製集合的主節點可以同時接受讀/寫操作,但是從節點只能進行讀取操作。如果服務主節點失敗,集群會選擇一個從節點,並自動提升為主節點。當之前的主節點主節點恢復後,自動作為從節點進行工作。
3.5 加速與持久化
寫入速度(write speed):
資料庫給定的時間內插入、更新、刪除的容量。
持久化(durability):
資料庫寫操作被永久保存的保證級別。
3.6 伸縮
伸縮資料庫的最簡單的方式就是升級伺服器硬體(添加更快的磁碟、更多的記憶體、更強的CPU來接觸資料庫性能瓶頸)。
垂直擴展(vertical scaling 或 scaling up)
提升單節點參數的做法通常稱為垂直擴展,垂直擴展非常簡單、可靠,但是達到某個點後成本很高,最終達到一個無法低成本垂直擴展的臨界點。
水平擴展(horizontally 或 scaling out)
水平擴展指的是在多台機器上分散式存儲資料庫,而不是提升單個節點的配置。水平擴展架構可以運行在許多台很小的、很廉價的機器上,通常可以減少硬體的成本。並且分散式存儲數據可以降低宕機帶來的丟失數據的後果。
MongoDB的伸縮性
MongoDB採用基於範圍的分區機智來實現水平擴展,稱為分片機智,它可以自動化管理每個分散式節點存儲的數據。(另外,還有基於哈希和基於tag的分片機制)
分片系統處理額外的分片節點,而且它還會自動化災備,每個獨立的節點是一個可複製集合,至少由2台機器組成,確保節點失敗的時候可以自動回復。
四、總結
總的來說,Mongo的概念理解起來不算太難,有關係型資料庫相關經驗的可以對比著進行學習。