1. 程式人生 > >Mongodb學習(一)

Mongodb學習(一)

NoSQL

為什麼使用NoSql?
1.現實

    1. 大量的資料。
    2. 資料呈現出半結構化或者結構化狀態。
    3. 儲存資料的磁碟提取速度增長遠比不上資料量的增長,儲存和分析資料問題越來越大(90年磁碟速度是4.4M/s,現在已經可以達到幾百M/s)。

面對第三個問題,我們可以使用多個磁碟儲存資料,使用時可以並行得提取。
這樣也帶來了一些新的問題:
1. 多個磁碟如果一個損壞,那麼就將導致資料不完整。如果一個磁碟在一年裡損壞的機率為0.01(假設),那麼當只有一個磁碟時,損壞機率只有0.01,完整機率為0.99,如果有10個磁碟,那麼一年內完整的機率為(0.99)**10 = 0.904。所以就需要使用多個磁碟作為備份。

RAID(這也是磁碟列陣的解決方式)
2. 資料分析需要從多個磁碟讀取資料,那麼就需要進行資料的整合。MapReduce

2.RDBMS的解決方式
面對大量的資料,RDBMS可以進行分表
1. 水平分表,將大表按照列分表
分表的方式有:Range, Hash, Key, List and Composite

CREATE  TABLE   TBL_STUDENT
(   ID  int default NULL,
NAME    varchar(30) default NULL,
BIRTHDAY    date    default
NULL ) engine=myisam PARTITION BY RANGE (year(BIRTHDAY)) (PARTITION p0 VALUES LESS THAN (1995), PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) , PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999
) , PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) , PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) , PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010), PARTITION p11 VALUES LESS THAN MAXVALUE );

這裡寫圖片描述

2.豎直分表
相比較水平分表而言,更加複雜,但是效果也更加明顯。

但是,如果在多個大表之間join,將會導致極大的資料處理量,非常不適合處理。
因此開始大量使用NoSQL。
更多關於NoSQL

Mongodb的基本概念

MongoDB (“hu mongo us”)是使用C++ 寫的文件型別的開源資料庫。
Mongodb特性:
它的特點是高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:

*面向集合儲存,易儲存物件型別的資料。
*模式自由。
*支援動態查詢。
*支援完全索引,包含內部物件。
*支援查詢。
*支援複製和故障恢復。
*使用高效的二進位制資料儲存,包括大型物件(如視訊等)。
*自動處理碎片,以支援雲端計算層次的擴充套件性。
*支援RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
*檔案儲存格式為BSON(一種JSON的擴充套件)。
*可通過網路訪問

基本概念:
1. 文件(document)是MongoDB的最基本單元。
例如:

{
    "name"  :   "John   Doe",
    "address"   :   {
            "street"    :   "123    Park    Street",
            "city"  :   "Anytown",
            "state" :   "NY"
    }       
}

文件的約束條件:
1. “_” 開頭的鍵不能作為系統內部保留值。
2. 鍵不能包含 null(\0),”.”,不能以 ($)開頭 。

文件在資料庫中使用BSON格式儲存:

     BSON是一個輕量級的二進位制資料格式。MongoDB能夠使用BSON,並將BSON作為資料的儲存存放在磁碟中。
    當Client端要將寫入文件,使用查詢等等操作時,需要將文件編碼為BSON格式,然後再發送給Server端。同樣,Server端的返回結果也是編碼為BSON格式再放回給Client端的。

使用BSON格式出於以下3種目的:
效率
    BSON是為效率而設計的,它只需要使用很少的空間。即使在最壞的情況下,BSON格式也比JSON格式再最好的情況下儲存效率高。

傳輸性
    在某些情況下,BSON會犧牲額外的空間讓資料的傳輸更加方便。比如,字串的傳輸的字首會標識字串的長度,而不是在字串的末尾打上結束的標記。這樣的傳輸形式有利於MongoDB修改傳輸的資料。

效能
    最後,BSON格式的編碼和解碼都是非常快速的。它使用了C風格的資料表現形式,這樣在各種語言中都可以高效地使用。
  1. 集合(collection)是文件的集合,可以視為沒有schema的table,在mongodb3.2之後,可以限定一個collection有確定的文件結構。參考
  2. 每一個文件有一個唯一的主鍵 _id ,如果一個物件沒有設定主鍵,那麼mongo會自動產生一個12位的ObjectID(這是一個型別),ObjectId使用12位元組的儲存空間,每個位元組兩位十六進位制數字,是一個24位的字串。打印出來的這個長長的ObjectId是實際儲存資料的兩倍長。預設ID生成策略