天天看點

mongodb快速入門

mongodb介紹

MongoDB是一個高性能,開源,無模式的文檔型資料庫,是目前NoSql資料庫中比較熱門的一種。它在許多場景下可用于替代傳統的關系型資料庫或鍵/值存儲方式。Mongo使用C++開發。Mongo的官方網站位址是://www.mongodb.org/

NoSql,全稱是 Not Only Sql,指的是非關系型的資料庫。下一代資料庫主要解決幾個要點:非關系型的、分布式的、開源的、水準可擴充的。原始的目的是為了大規模web應用,這場運動開始于2009年初,通常特性應用如:模式自由、支援簡易複制、簡單的API、最終的一緻性(非ACID)、大容量資料等。NoSQL被我們用得最多的當數key-value存儲,當然還有其他的文檔型的、列存儲、圖型資料庫、xml資料庫等。

特點

高性能、易部署、易使用,存儲資料非常友善。主要功能特性有:

面向集合存儲,易存儲對象類型的資料。

模式自由。

支援動态查詢。

支援完全索引,包含内部對象。

支援查詢。

支援複制和故障恢複。

使用高效的二進制資料存儲,包括大型對象(如視訊等)。

自動處理碎片,以支援雲計算層次的擴充性

支援Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程式,社群中也提供了對Erlang及.NET等平台的驅動程式。

檔案存儲格式為BSON(一種JSON的擴充)。

可通過網絡通路。

功能

面向集合的存儲:适合存儲對象及JSON形式的資料。

動态查詢:Mongo支援豐富的查詢表達式。查詢指令使用JSON形式的标記,可輕易查詢文檔中内嵌的對象及數組。

完整的索引支援:包括文檔内嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,并生成一個高效的查詢計劃。

查詢監視:Mongo包含一個監視工具用于分析資料庫操作的性能。

複制及自動故障轉移:Mongo資料庫支援伺服器之間的資料複制,支援主-從模式及伺服器之間的互相複制。複制的主要目标是提供備援及自動故障轉移。

高效的傳統存儲方式:支援二進制資料及大型對象(如照片或圖檔)

自動分片以支援雲級别的伸縮性:自動分片功能支援水準的資料庫叢集,可動态添加額外的機器。

适用場景

網站資料:Mongo非常适合實時的插入,更新與查詢,并具備網站實時資料存儲所需的複制及高度伸縮性。

緩存:由于性能很高,Mongo也适合作為資訊基礎設施的緩存層。

大尺寸,低價值的資料:使用傳統的關系型資料庫存儲一些資料時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的檔案進行存儲。

高伸縮性的場景:Mongo非常适合由數十或數百台伺服器組成的資料庫。Mongo的路線圖中已經包含對MapReduce引擎的内置支援。

用于對象及JSON資料的存儲:Mongo的BSON資料格式非常适合文檔化格式的存儲及查詢。

MongoDB的使用限制

高度事務性的系統:例如銀行或會計系統。傳統的關系型資料庫目前還是更适用于需要大量原子性複雜事務的應用程式。

傳統的商業智能應用:針對特定問題的BI資料庫會對産生高度優化的查詢方式。對于此類應用,資料倉庫可能是更合适的選擇。

安裝與運作

官網下載下傳對應的版本,一定要厘清楚是32位還是64位

此處以32位的tar.gz包為例子

tar

mv改名,改名為mongodb

mv移動到/opt目錄下,并修改權限為777

mkdir -p /data/db,并修改權限為777

vi ~/.bashrc

加入:export PATH=/opt/mongodb/bin:$PATH

重新開機機器

輸入指令mongod即可啟動,可以看到端口,浏覽器通路IP+端口即可(不要關閉該視窗)

如果無法啟動就删除掉/data/db下的mongod.lock

mongoVUE基本操作

MongoVUE是一個MongoDB在windwos下的用戶端管理工具,一般都會使用它來操作。

name随便寫,server寫你伺服器的ip,port端口号,mongodb的預設端口是27017,然後連接配接就OK

體系結構

MongoDB 的文檔(document) ,相當于關系資料庫中的一行記錄。

多個文檔組成一個集合(collection) ,相當于關系資料庫的表。

多個集合(collection) ,邏輯上組織在一起,就是資料庫(database) 。

一個 MongoDB 執行個體支援多個資料庫(database) 。

單條件查詢

in查詢

多條件查詢and

多條件查詢or

顯示查詢字段

排序(1 升序;-1 降序)

插入記錄

修改記錄

删除記錄

輸入條件,運作即可删除

mongodb監控——mongostat

getmore:通常發生在結果集比較大的查詢時, 第一個query傳回了部分結果,後續的結果是通過getmore來擷取的

flushs:每秒執行同步将資料寫入硬碟的次數。

mapped 映射到記憶體的資料大小,機關是MB,

vsize:虛拟記憶體使用量,機關MB

res:實體記憶體使用量,機關MB

faults:每秒通路失敗數(隻有Linux有),資料被交換出實體記憶體,放到swap。不要超過100,否則就是機器記憶體太小,造成頻繁swap寫入。此時要更新記憶體或者擴充

locked db:被鎖的時間百分比,盡量控制在10%以下

idx miss %:索引不命中所占百分比。如果太高的話就要考慮索引是不是設計不合理

qr|qw ar|aw: mongo負載高時,指令來不及處理,mongo将指令放入隊列。 qr|qw 等待讀/寫的隊列長度 ar|aw 執行讀/寫操作用戶端數量。

conn:有多少連接配接

mongodb profiler

類似于mysql中的慢查詢

開啟profile

db.setProfilingLevel(n);

n:

0 - 關閉性能分析,測試環境可以打開,生成環境關閉,對性能有很大影響

1 - 開啟慢查詢日志,執行時間大于100毫秒的語句

2 - 開啟所有記錄檔

db.setProfilingLevel(level , slowms);

Mongo Profile 記錄是直接存在系統db裡的,記錄位置local》collections》system.profile

重點名額以及常見優化

millis: 該指令執行耗時,以毫秒記

responseLength:查詢傳回的長度

nscanned:在執行查詢操作的時候掃描了多少對象

nreturned:從查詢中傳回的結果對象

如果 nscanned(掃描的記錄數)遠大于 nreturned(傳回結果的記錄數)的話,那麼我們就要考慮通過加索引來優化記錄定位了。

db.表名.ensureIndex({age:1}) //1(升序);-1(降序)

對于建立索引的建議是:如果很少讀,那麼盡量不要添加索引,因為索引越多,寫操作會越慢。如果讀量很大,那麼建立索引還是比較劃算的。

當傳回的結果集很大時即responseLength值相當大時,會使得性能下降,在做find查詢時,需要添加第二個查詢參數,隻擷取需要顯示的字段.

造成慢查詢可能是索引的問題,也可能是資料不在記憶體造成(磁盤讀入)。

最大連接配接數

db.serverStatus().connections;

current數值+available數值就是目前mongodb最大連接配接數

啟動裡面加參數 --maxConns=3000

不要忘了linux中的打開最大檔案連接配接數會影響此處的設定,一定要把他也調大

mongo主從複制

架構上和mysql的主從複制類似,原理如下:

mongodb的複制至少需要兩個伺服器或者節點。其中一個是主,負責處理用戶端請求,其餘為從,負責映射主節點的資料。主節點記錄在其上執行的所有操作。從節點定期輪詢主節點獲得操作,然後對自己的資料副本執行這些操作。

打開oplog