技術貼—Mongodb解析

MySQL 盤點 科技 中國移動小覓覓 2017-04-14

Mongodb簡介

MongoDB 是一個基於分佈式文件存儲的數據庫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。

MongoDB將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。

技術貼—Mongodb解析

Mongodb特點

  • MongoDB的提供了一個面向文檔存儲,操作起來比較簡單和容易。

  • 可以在MongoDB記錄中設置任何屬性的索引(如:FirstName="Sameer",Address="8Gandhi Road")來實現更快的排序。

  • 可以通過本地或者網絡創建數據鏡像,這使得MongoDB有更強的擴展性。

  • 如果負載的增加(需要更多的存儲空間和更強的處理能力),它可以分佈在計算機網絡中的其他節點上這就是所謂的分片。

  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。

  • MongoDb 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。

  • Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操作。

  • Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。

  • Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。

  • GridFS是MongoDB中的一個內置功能,可以用於存放大量小文件。

  • MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。

  • MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

  • MongoDB安裝簡單。

Mongodb應用場景

Mongodb現階段已被許多大型網站應用,例如:淘寶,京東,github,ebay等。許多網站並非完全將傳統的關係型數據庫替換為mongodb,而是選擇性的在部分模塊應用。在應用mongodb之前,要根據自身需求以及mongodb的特點、不足進行選擇。目前,mongodb適用於以下一些場景:

  • 網站數據:mongo非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性。

  • 緩存:由於性能很高,mongo也適合作為信息基礎設施的緩存層。在系統重啟之後,由mongo搭建的持久化緩存可以避免下層的數據源過載。

  • 大尺寸、低價值的數據:使用傳統的關係數據庫存儲一些數據時可能會比較貴,在此之前,很多程序員往往會選擇傳統的文件進行存儲。

  • 高伸縮性的場景:mongo非常適合由數十或者數百臺服務器組成的數據庫。用於對象及JSON數據的存儲:mongo的BSON數據格式非常適合文檔格式化的存儲及查詢。

Mongodb優缺點

Mongodb相對關係型數據庫有如下優點:

  • 高可擴展性

  • 分佈式計算

  • 低成本

  • 架構的靈活性,半結構化數據

  • 沒有複雜的關係

在滿足以上優點的同時,卻沒有關係型數據庫那樣嚴格的事物支持,通常情況下,mongodb這一缺點阻礙了人們對其的選擇。對於習慣利用關係型數據庫的開發人員來說,mongodb沒有關聯查詢,這也是在做數據庫選型時會考慮到的。

在非關係型數據庫中,mongdb擁有相對突出的優勢,mongodb之所以是介於關係型數據庫和非關係型數據庫的產品,在於它提供了非常豐富的功能,例如MySQL中常用的數據增刪改查,索引,聚合查詢,分頁這些功能,mongodb都提供了相應的能力,與hbase列存儲相比,方便了數據的可操作性。

Mongodb適用項目

針對開發者在進行項目數據庫選型時,根據mongodb的特點,優勢,缺點綜合考慮其適合性。例如在項目中進行的事務性操作比較多,那麼mongodb就不是合適的選擇。考慮到mongodb的數據存儲結構比較靈活,並非固定結構,即擴展性高,那麼在項目中經常出現需要擴展數據字段的情況,則可以選擇mongodb。當然,項目中也可以利用不同的數據庫,根據數據的性質選擇存儲的位置。

Mongodb概念

以下通過與MySQL對比介紹mongodb基本的術語:

技術貼—Mongodb解析

通過下圖實例,我們也可以更直觀的的瞭解Mongo中的一些概念:

技術貼—Mongodb解析

在mongodb中不存在表關聯這一概念,但可以利用文檔的內嵌達到數據的直接關聯。

數據庫

一個mongodb中可以建立多個數據庫。 MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。 MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。

集合

集合就是MongoDB文檔組,類似於RDBMS(關係數據庫管理系統:RelationalDatabase Management System)中的表格。集合存在於數據庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。

文檔

文檔是一組鍵值(key-value)對(即BSON)。MongoDB的文檔不需要設置相同的字段,並且相同的字段不需要相同的數據類型,這與關係型數據庫有很大的區別,也是 MongoDB 非常突出的特點。

MongoDB 數據類型

下表為MongoDB中常用的幾種數據類型。

技術貼—Mongodb解析

Mongodb通用指令

Mongodb的Linux安裝比較簡單,在安裝完mongodb後,正常啟動的情況下,進入應用的/bin目錄下,執行命令./mongo便進入mongodb的後臺管理shell,第一次進入shell時是默認選擇test庫。可通過exit或quit(),或trl+C退出shell。

Mongodb中常用的shell指令

技術貼—Mongodb解析

以上簡單介紹指令的用法,詳細說明可參考官方文檔:https://docs.mongodb.com/manual/mongo/

在mongodb中創建索引時需要注意的事項:

  • 索引佔據存儲空間,存儲在內存中,不能超過內存的限制,如果超過會自動刪除索引,影響性能。

  • 集合中索引不能超過64個

  • 索引名的長度不能超過125個字符

  • 一個複合索引最多可以有31個字段

MongoDB GridFS

GridFS是MongoDB中的一個內置功能,可以用於存放大量小文件,以下簡單介紹gridFS的用途特點:

  • GridFS 用於存儲和恢復那些超過16M(BSON文件限制)的文件(如:圖片、音頻、視頻等)。

  • GridFS 也是文件存儲的一種方式,但是它是存儲在MonoDB的集合中。

  • GridFS 可以更好的存儲大於16M的文件。

  • GridFS會將大文件對象分割成多個小的chunk(文件片段),一般為256k/個,每個chunk將作為MongoDB的一個文檔(document)被存儲在chunks集合中。

  • GridFS 用兩個集合來存儲一個文件:fs.files與fs.chunks。

  • 每個文件的實際內容被存在chunks(二進制數據)中,和文件有關的meta數據(filename,content_type,還有用戶自定義的屬性)將會被存在files集合中。

fs.files 集合文檔舉例:

{

"filename": "test.txt",

"chunkSize": NumberInt(261120),

"uploadDate": ISODate("2014-04-13T11:32:33.557Z"),

"md5": "7b762939321e146569b07f72c62cca4f",

"length": NumberInt(646)

}

fs.chunks 集合文檔舉例:

{

"files_id": ObjectId("534a75d19f54bfec8a2fe44b"),

"n": NumberInt(0),

"data": "Mongo Binary Data"

}

詳細說明可參考官方文檔:https://docs.mongodb.com/manual/core/gridfs/

Mongodb的存儲引擎

在mongodb3.0之前,存儲引擎是MMAP,屬於庫級鎖,所有數據庫的集合文檔,索引數據存入一個文件。

Mongodb3.0,推出了MMAPV1,wiredtiger 。

MMAPV1,適應於所有MongoDB版本,MongoDB3.0的默認引擎,屬於集合級鎖。相對於MMAP,併發性能有所提升,同時其空間預分配策略以2的N次方規則進行分配,優化了空間的利用。

Wiredtiger,在mongodb3.2作為默認的存儲引擎,通過多版本併發控制完成文檔級別鎖,併發量提高;數據壓縮率高於MMAPV1,由於數據壓縮率高,佔用內存及CPU也增高;wiredtiger通過定期數據快照操作和預寫日誌完成數據的一致性,同時可作為數據恢復的依據。

在mongodb3.2版本還推出了In-Memory存儲引擎,其特點是數據存儲於內存中,只將少量元數據和診斷日誌存儲到磁盤。

Mongodb的存儲引擎類型可通過參數進行配置,開發者可根據幾個存儲引擎的特點結合實際需求進行選擇。

相關推薦

推薦中...