MongoDB的操作因素和資料模型

來源:互聯網
上載者:User

MongoDB的操作因素和資料模型

MongoDB的建模應用程式資料取決於資料本身,也跟MongoDB的特性有關。比如,不同的資料模型可能提高應用程式的查詢效率,提高插入和更新操作的輸送量,讓分區叢集更有效提高分發效率。

這些處理或記錄需求的因素,出現在應用程式以外,但是會影響以MongoDB為資料庫的應用。當建立資料模型時,在下述情境下需要考慮應用程式的讀操作和寫操作。

CentOS編譯安裝MongoDB

CentOS 編譯安裝 MongoDB與mongoDB的php擴充

CentOS 6 使用 yum 安裝MongoDB及伺服器端配置

Ubuntu 13.04下安裝MongoDB2.4.3

MongoDB入門必讀(概念與實戰並重)

《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]

文檔增長

更新文檔可能會導致文檔大小的增加,這些更新包括添加元素到數組,添加新欄位到文檔中等等。如果文檔增長的大小打到了文檔允許的最大大小,MongoDB會重新分配磁碟上的文檔。重新分配文檔會佔用比更新文檔更長的時間,並且可能會導致文檔片段。儘管MongoDB自動填滿文檔分配來將重新分配的可能性最小化,但資料建模時應儘可能避免文檔增長。

例如,如果你的應用程式更新會增加文檔大小,你應該重構資料模型,在不同文檔之間使用引用而不是使用非正常化的資料模型(Embeded Data Model)。

MongoDB的自適應調整有利於減少資料的遷移,你可能想要使用一種預分配的模式避免文檔的增長。

原子性

在MongoDB中,文檔層級的操作都是原子性的,沒有一個寫操作可以自動影響到多個文檔或多個集合。在一個集合中修改多個文檔時,需要在每個文檔上都操作一次。為確保應用程式在一個文檔中儲存儲存所有原子性需求的欄位,如果應用程式能夠容忍非原子性兩塊資料的更新,你可以這些資料存放區在不同的文檔中。

使用嵌入式資料模型有利於在一個文檔中完成這些原子操作。對於那些將相關資料通過參考模式儲存的資料模型,應用程式必須通過不同的讀和寫操作來完成查詢和修改這些相關的資料。

分區

MongoDB通過分區提供水平擴充。這些叢集支援部署大資料集合和高通量操作。分區允許使用者將資料庫中的一個集合分割成多個Mongod執行個體或分區的多個文檔集合。

MongoDB使用分區關鍵字來分發資料和訪問量。選擇合適的分區關鍵字可以提高程式的效能,並且能夠啟動或關閉查詢隔離來提高程式的寫效能,所以,一定要仔細考慮好分區的欄位。

索引

使用索引能夠提高普通的查詢效能。索引經常建立在頻繁使用查詢並且在所有的操作中返回排序的資料。MongoDB會在_id欄位上建立索引。

MongoDB使用索引時,需要考慮以下情境:

(1)每個索引需要至少8kb的資料空間。

(2)添加索引會影響寫操作的效能。對於那些高速讀寫的操作,在每次插入或更新時索引的更新代價是高昂的。

(3)高讀寫的集合通常受益於額外的索引,索引不會影響沒加索引的讀操作。

(4)活動狀態下,索引會佔用磁碟的硬碟和記憶體。這種佔用是很費資源的,應該監控系統的規劃容量,尤其是工作集的大小。

大資料集合

在某些情況下,可能會考慮將相關的資料存放區在幾個不同的集合裡,而不是在一個集合中儲存。

考慮一下logs集合用來儲存不同的環境變數和應用程式的情形,logs集合由以下類型的表單組成:

{ log: "dev", ts: ..., info: ... }

{ log: "debug", ts: ..., info: ...}

如果文檔的數量太少的話,你可能會按照類型去為文檔分組。對於logs來說,考慮維護不同的日誌的集合,比如logs_dev和logs_debug。logs_dev集合只會包含開發環境有關的文檔。

一般來說,大量的資料集合不會有顯著的效能影響,仍然是高效能的。不同的集合對於高通量的集合是非常重要的。

當模型中有大量集合時,需要考慮以下情境:

(1)每個集合都有最少的幾kb的開銷。

(2)每個索引,包括_id上的索引,都需要至少8kb的資料空間。

(3)對每個資料庫而言,每個命名空間(.ns檔案)儲存了資料的所有中繼資料。並且每個索引和集合有自己條目的命名空間。MongoDB的命名空間檔案的大小是有限制的(不能超過2047MB)。

(4)MongoDB限制命名空間的數量(命名空間的大小除以628)。如果想要知道當前命名空間的序號以便於知道還有多少可以使用命名空間,在Mongo shell中運行以下命令即可:

db.system.namespaces.count()

命名空間的大小取決於.ns檔案的大小,預設的命名空間的大小是16MB。

要改變命名空間檔案的大小,在啟動server時加入如下參數即可:

--nssize <new size MB>

對於已經存在的資料庫,使用-nssize參數啟動server後,運行以下命令即可。

db.repairDatabase()

資料生命週期管理

資料建模也應該把資料生命週期管理考慮在內。

所有的文檔集合在使用一段時間後都會到期,如果應用程式需要儲存一些資料在資料庫中一段時間,考慮使用TTL(Time To Live)特性。

另外,如果應用程式僅使用最近插入的文檔。考慮使用限制的集合(Capped Collections)。Capped Collections使用先進先出的方式插入文檔提高基於順序插入資料的插入和讀取文檔的效能。

MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.