mongodb系列教程——1初接觸
MongoDB是什麼?
MongoDB屬於記憶體型資料庫,是一種基於文件的,非關係資料庫,在需要讀效能要求很高的專案中有著比較不錯的表現。可做前段快取伺服器、緩衝資料儲存區,同樣也可以作為應用系統的儲存伺服器,例如微博、論壇等應用系統,也可以作為圖片儲存伺服器(分散式);在資料寫方面,Mongo也支援比較高的寫速率(當然這取決於硬體裝置)。這比一般使用硬碟儲存介質的關係資料庫的儲存效率要高很多。但是,非關係資料庫會造成大量冗餘資料,如果前期的系統設計很粗糙,後期的資料維護將會相當困難。
monogdb與傳統的關係資料庫的對比
優點: ①弱一致性(最終一致),更能保證使用者的訪問速度:舉例來說,在傳統的關係型資料庫中,一個COUNT型別的操作會鎖定資料集,這樣可以保證得到“當前”情況下的精確值。這在某些情況下,例 如通過ATM檢視賬戶資訊的時候很重要,但對於Wordnik來說,資料是不斷更新和增長的,這種“精確”的保證幾乎沒有任何意義,反而會產生很大的延 遲。他們需要的是一個“大約”的數字以及更快的處理速度。
但某些情況下MongoDB會鎖住資料庫。如果此時正有數百個請求,則它們會堆積起來,造成許多問題。我們使用了下面的優化方式來避免鎖定:
每次更新前,我們會先查詢記錄。查詢操作會將物件放入記憶體,於是更新則會盡可能的迅速。在主/從部署方案中,從節點可以使用“-pretouch”引數執行,這也可以得到相同的效果。 使用多個mongod程序。我們根據訪問模式將資料庫拆分成多個程序。
②文件結構的儲存方式,能夠更便捷的獲取資料。
對於一個層級式的資料結構來說,如果要將這樣的資料使用扁平式的,表狀的結構來儲存資料,這無論是在查詢還是獲取資料時都十分困難。
舉例1:
就拿一個“字典項”來說,雖然並不十分複雜,但還是會關係到“定義”、“詞性”、“發音”或是“引用”等內容。大部分工程師會將這種模型使用關係型資料庫 中的主鍵和外來鍵表現出來,但把它看作一個“文件”而不是“一系列有關係的表”豈不更好?使用 “dictionary.definition.partOfSpeech='noun'”來查詢也比表之間一系列複雜(往往代價也很高)的連線查詢方便 且快速。
舉例2:在一個關係型資料庫中,一篇部落格(包含文章內容、評論、評論的投票)會被打散在多張資料表中。在MongoDB中,能用一個文件來表示一篇部落格, 評論與投票作為文件陣列,放在正文主文件中。這樣資料更易於管理,消除了傳統關係型資料庫中影響效能和水平擴充套件性的“JOIN”操作。
舉例③:db.blogposts.save({ title : "My First Post", author: {name : "Jane", id :1}, comments : [{ by: "Abe", text: "First" }, { by : "Ada", text : "Good post" }] }) db.blogposts.find( { "author.name" : "Jane" } ) db.blogposts.findOne({ title : "My First Post", "author.name": "Jane", comments : [{ by: "Abe", text: "First" }, { by : "Ada", text : "Good post" } ] }) db.blogposts.find( { "comments.by" : "Ada" } ) db.blogposts.ensureIndex( { "comments.by" : 1 } );
MongoDB是一個面向文件的資料庫,目前由10gen開發並維護,它的功能豐富,齊全,完全可以替代MySQL。在使用MongoDB做產品原型的過程中,我們總結了MonogDB的一些亮點:
使用JSON風格語法,易於掌握和理解:MongoDB使用JSON的變種BSON作為內部儲存的格式和語法。針對MongoDB的操作都使用JSON風格語法,客戶端提交或接收的資料都使用JSON形式來展現。相對於SQL來說,更加直觀,容易理解和掌握。
Schema-less,支援嵌入子文件:MongoDB是一個Schema-free的文件資料庫。一個數據庫可以有多個Collection,每 個Collection是Documents的集合。Collection和Document和傳統資料庫的Table和Row並不對等。無需事先定義 Collection,隨時可以建立。
Collection中可以包含具有不同schema的文件記錄。 這意味著,你上一條記錄中的文件有3個屬性,而下一條記錄的文件可以有10個屬 性,屬性的型別既可以是基本的資料型別(如數字、字串、日期等),也可以是陣列或者雜湊,甚至還可以是一個子文件(embed document)。這 樣,可以實現逆規範化(denormalizing)的資料模型,提高查詢的速度。
③內建GridFS,支援大容量的儲存。
GridFS是一個出色的分散式檔案系統,可以支援海量的資料儲存。
內建了GridFS了MongoDB,能夠滿足對大資料集的快速範圍查詢。
④內建Sharding。
提供基於Range的Auto Sharding機制:一個collection可按照記錄的範圍,分成若干個段,切分到不同的Shard上。
Shards可以和複製結合,配合Replica sets能夠實現Sharding+fail-over,不同的Shard之間可以負載均衡。查詢是對 客戶端是透明的。客戶端執行查詢,統計,MapReduce等操作,這些會被MongoDB自動路由到後端的資料節點。這讓我們關注於自己的業務,適當的 時候可以無痛的升級。MongoDB的Sharding設計能力最大可支援約20 petabytes,足以支撐一般應用。
這可以保證MongoDB執行在便宜的PC伺服器叢集上。PC叢集擴充起來非常方便並且成本很低,避免了“sharding”操作的複雜性和成本。
⑤第三方支援豐富。(這是與其他的NoSQL相比,MongoDB也具有的優勢) 現在網路上的很多NoSQL開源資料庫完全屬於社群型的,沒有官方支援,給使用者帶來了很大的風險。
而開源文件資料庫MongoDB背後有商業公司10gen為其提供供商業培訓和支援。
而且MongoDB社群非常活躍,很多開發框架都迅速提供了對MongDB的支援。不少知名大公司和網站也在生產環境中使用MongoDB,越來越多的創新型企業轉而使用MongoDB作為和Django,RoR來搭配的技術方案。
⑥效能優越:
在使用場合下,千萬級別的文件物件,近10G的資料,對有索引的ID的查詢不會比mysql慢,而對非索引欄位的查詢,則是全面勝出。 mysql實際無法勝任大資料量下任意欄位的查詢,而mongodb的查詢效能實在讓我驚訝。寫入效能同樣很令人滿意,同樣寫入百萬級別的數 據,mongodb比我以前試用過的couchdb要快得多,基本10分鐘以下可以解決。補上一句,觀察過程中mongodb都遠算不上是CPU殺手。
與關係型資料庫相比,MongoDB的缺點:
①mongodb不支援事務操作。②mongodb佔用空間過大。 關於其原因,在官方的FAQ中,提到有如下幾個方面:
1、空間的預分配:為避免形成過多的硬碟碎片,mongodb每次空間不足時都會申請生成一大塊的硬碟空間,而且申請的量從64M、128M、256M那 樣的指數遞增,直到2G為單個檔案的最大體積。隨著資料量的增加,你可以在其資料目錄裡看到這些整塊生成容量不斷遞增的檔案。
2、欄位名所佔用的空間:為了保持每個記錄內的結構資訊用於查詢,mongodb需要把每個欄位的key-value都以BSON的形式儲存,如果 value域相對於key域並不大,比如存放數值型的資料,則資料的overhead是最大的。一種減少空間佔用的方法是把欄位名儘量取短一些,這樣佔用 空間就小了,但這就要求在易讀性與空間佔用上作為權衡了。我曾建議作者把欄位名作個index,每個欄位名用一個位元組表示,這樣就不用擔心欄位名取多長 了。但作者的擔憂也不無道理,這種索引方式需要每次查詢得到結果後把索引值跟原值作一個替換,再發送到客戶端,這個替換也是挺耗費時間的。現在的實現算是 拿空間來換取時間吧。
3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除後的資料的大規模挪動,原記錄空間不刪除,只標記“已刪除”即可,以後還可以重複利用。
4、可以定期執行db.repairDatabase()來整理記錄,但這個過程會比較緩慢
③MongoDB沒有如MySQL那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方。
推薦工具:MongoBooster 這款介面管理工具挺好用。
相關推薦
mongodb系列教程——1初接觸
MongoDB是什麼? MongoDB屬於記憶體型資料庫,是一種基於文件的,非關係資料庫,在需要讀效能要求很高的專案中有著比較不錯的表現。可做前段快取伺服器、緩衝資料儲存區,同樣也可以作為應用系統的儲存伺服器,例如微博、論壇等應用系統,也可以作為圖片儲存伺服器(分散式);
Go 系列教程-1 基礎知識
變數是什麼 變數指定了某儲存單元(Memory Location)的名稱,該儲存單元會儲存特定型別的值。在 Go 中,有多種語法用於宣告變數。 宣告單個變數 var name type 是宣告單個變數的語法。 package main import "f
java nio 系列教程(1)----buffer介紹和使用方法
大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油 package com.zzh.buffer; import org.junit.jupiter.api.Test; import java.nio.ByteBuffer; /** * 一.緩衝區(b
學習Go 系列教程 —— 1. 介紹與安裝
這是我們 Golang 系列教程的第一個教程。 Golang 是什麼 Go 亦稱為 Golang(譯註:按照 Rob Pike 說法,語言叫做 Go,Golang 只是官方網站的網址),是由谷歌開發的一個開源的編譯型的靜態語言。 Golang 的主要關注點是使得
瞭解Flex SDK系列教程(1.Ant和FlexTask)
轉:http://www.riameeting.com/node/1009 推薦兩篇教程http://www.adobe.com/devnet/flex/articles/flex_ant_pt1.htmlhttp://www.adobe.com/devnet/flex/articles/fle
Go 系列教程 —— 1. Go語言開發環境搭建詳解
Go語言介紹Go語言是Google於2009年釋出的第二款開源的程式語言。Go語言的特點:準對多處理器應用程式的程式設計進行了優化,使用Go編譯程式可以媲美C或C++的程式碼速度,而且擁有Python解釋語言的簡潔和開發效率。Go語言優勢可以編譯成機器碼,不依賴其他庫靜態型別
基於TensorFlow的深度學習系列教程 1——Hello World!
最近看到一份不錯的深度學習資源——Stanford中的CS20SI:《TensorFlow for Deep Learning Research》,正好跟著學習一下TensorFlow的基礎,還是收穫頗豐,隨手整理成部落格隨時翻閱。 為什麼選擇TensorFlow? 自從12年AlexNet獲得
mongodb3.6系列教程1--資料庫操作
1 新建或切換資料庫 新建或切換名稱為 mongoTest 的資料庫 use mongoTest 如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。 2 檢視所有的資料庫 show dbs 結果: admin 0.000GB
css系列教程1-選擇器全解
全棧工程師開發手冊 (作者:欒鵬) css選擇器全解: css選擇器包括:基本選擇器、屬性選擇器、偽類選擇器、偽元素選擇器 選擇器總是從左至右解析,不要私自新增()優先運算
jquery系列教程1-選擇器全解
全棧工程師開發手冊 (作者:欒鵬) jquery選擇器全解: jquery選擇器$(“xxxx”),傳入字串獲取元素,字串的寫法與css的寫法相同。 基本選擇器 $("#myid
mono for android學習過程系列教程(1)
直接進入主題,關於mono for android的學習,首先配置好環境,如何配置環境,度娘谷歌一大堆,記得使用破解版。 我自己是百度“黑馬四期”傳智播客的視訊,裡面有破解版開發環境的軟體。 今天直接來上手記錄下自己學習mono for android的種種。 首先:新建好一個安卓專案,切記路徑不可有中
樹莓派開發系列教程1——樹莓派介紹
1、樹莓派是什麼? Raspberry Pi(中文名為“樹莓派”,簡寫為RPi,或者RasPi/RPi)是為學生計算機程式設計教育而設計,只有信用卡 大小的卡片式電腦,其系統基於Linux。 樹莓派由註冊於英國的慈善組織“Raspberry
django 操作mongoDB Mongoengine教程(1)——概述
MongoEngine是MongoDB的一個ODM(Object-Document Mapper)框架,它提供了類似Django的語法來操作MongoDB資料庫。 安裝 安裝 MongoEngine 需要先安裝 PyMongo。 使用pip安裝 $ [sudo] pip install mongoe
js系列教程1-陣列操作全解
全棧工程師開發手冊 (作者:欒鵬) 陣列操作全解 js變數型別 var string; var name = "student",age=12; //unde
在以太坊發行代幣Token系列教程(1)
雖然國家目前嚴令禁止ICO,但是我覺得基於區塊鏈平臺的虛擬幣本身是很有價值的,大家只要不去碰基於發幣的ICO就好,因此這裡簡單談談怎麼在以太坊發行自己的代幣(Test網路)。 翻牆 目前來說,相關的網站很多都是被牆的,因此沒有梯子建議就放棄吧,推薦自己購
QtQuick系列教程(1)-Qml開發環境的搭建(Windows)
總目錄傳送 本博文技術等級: ★☆☆☆☆☆☆☆☆☆ 首先我們考察一下Windows下使用Qt的正確步驟, 其實學習就是一個探索的過程. 我的系統是Win10, 去Qt官網下載Windows下的Qt, 版本當然是最新. 很明顯, 我下載qt-op
OpenGL系列教程(1)——認識OpenGL
寫在前面 寫這個系列教程一方面是為了幫助我自己鞏固、理解OpenGL和計算機圖形學的知識,提升自己的寫作和表達能力,另一方面是為了分享自己在學習過程中收穫到的成果,與作為讀者的你共同進步。還有,這不是一個面向程式設計新手的系列教程,因此在學習該教程前,我假定你已十分熟悉C/C++語言,或者至少對程式設計的基
Android Studio系列教程1 (下載與安裝)
前言 前段時間開始學習使用Android Studio去開發Android應用(畢竟現在還用eclipse的話就out了),發現了一篇比較好的部落格,本著好東西大家一起分享的原則,在此把這篇部落格分享給大家^^ 背景 相信大家對Android Stud
nodejs+mongodb系列教程之(3/5)--理解路由和中介軟體
一、路由 路由是指如何定義應用的端點(URIs)以及如何響應客戶端的請求。 路由是由一個 URI、HTTP 請求(GET、POST等)和若干個控制代碼組成,它的結構如下: app.METHOD(path, [callback...], callback),app 是
從pwnable.kr 入門pwn系列教程(1)
前言: 前段時間學了一段時間pwn,因為某些事斷了下來,現在開始重新學習,現在立志要真正入門pwn,會編寫漏洞利用(利用pwntools),會基本linux命令,因為pwn題目很多都是在linux下的,比較少在windows下。 正文: 今天通過pwnable.kr的第