關於MongoDB的簡單理解(一)--基礎篇

學海無涯519發表於2021-01-29

一、什麼是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的概念理解起來不算太難,有關係型資料庫相關經驗的可以對比著進行學習。

相關文章