1. 程式人生 > >mongodb、mysql資料庫的幾個知識點

mongodb、mysql資料庫的幾個知識點

1、MongoDB與關係型資料庫的區別:

 MongoDB是一個面向文件的資料庫,資料結構為鍵值對組成,文件類似於JSON物件,欄位值可以包含陣列、其他文件。 
 
 MongoDB資料庫沒有預定模式,文件的鍵(key)值(value)不是固定的型別與大小,而關係型資料庫中每個表的欄位都是一樣的,靈活性比較差。
 MongoDB不具備關係型資料庫中的一些功能,比如連線(join)和複雜的多行事務。

2、mongodb提供了何種擔保級別(資料一致性)?
mongodb在併發讀寫操作中,提供瞭如下幾種擔保級別:

 1)write操作對單個文件是原子性的,比如更新一個文件中的多個域,要麼全部更新成功,要麼都不更新;那麼對於reader而言永遠不會看到只有部分更新成功的文件。對於單個mongod例項而言,發生在同一個文件上write操作是序列化的,read也是序列化的。 
 2)由query限定條件約束正確性,find()和update()操作只會影響那些符合條件的 documents。
 
 3)read操作中使用sort,結果的順序並不會因為併發寫入而破壞。



 ** mongodb儘管對單個document提供了較強的擔保,不過read和write操作可能會訪問任意數量的documents,mongodb不會對多個documents的操作提供事務性,也不會將一個將writes操作彼此隔離:


 1)“Non-point-in-time”,假如一個read操作開始於t1並開始read,此後t2時間,一個 write操作對某個document提交了update。reader或許會看到更新後的document,即read操作並不是讀取t1時刻的資料,而是模糊的,不像mysql事務那樣提供了嚴格的資料隔離級別,所以“不可重複讀”是一定會發生的。(即使用mongodb執行“select forupdate”操作將是不安全的)
 
 2)“Non-serializable”,針對不同的document,read和write操作是非序列化的.
 
  3)對於MMAPv1儲存引擎,讀資料時如果有updated或者delete操作,可能會有些資料“丟失”,即read開始時這些documents符合匹配規則,但是在read期間可能因為被update而不再符合匹配條件。(還是歸因於事務與隔離級別)

3、mongodb是否需要很大的記憶體?

  對記憶體的消耗取決於mongodb使用的儲存引擎,目前mongodb支援MMAPv1和wiredTiger兩種儲存引擎。

  MMAPv1:不需要,可以執行在少量記憶體的機器上;mongodb將會盡可能多的使用空閒記憶體,這由mmap機制(記憶體對映檔案的方法)決定(系統級別),所以系統資源監控時通常會顯示mongodb消耗了大量的記憶體,不過這種消耗是動態的,如果其他程序需要記憶體,那麼           mongodb將會讓步一些記憶體。這是由作業系統的虛擬記憶體管理機制決定,這意味著mongodb儘可能多的消耗空間記憶體,在需要時也會交換資料到磁碟。對於MMAPv1引擎,較大的記憶體空間可以極大的提升效能。

  wiredTiger:這是一個類似於bigtable(基於列族,LSM)的儲存引擎,mongodb會使用 wiredTiger cache(高速緩衝器);wiredTiger cache實體記憶體為:MAX(60% * RAM  -1G , 1G)  ;如果實體記憶體超過10G,那麼cache的大小為RAM的50%。不過具體消耗多少內  存,可以通過配置檔案來限定。mongodb過於消耗記憶體,所以wiredTiger引擎將改變這一情況!對於mongodb而言,較大的記憶體對效能的提升,是立竿見影的,無論是哪種引擎。

4、mongodb使用哪種型別的lock

 mongodb使用多粒度鎖,比如global、database、collection級別,對於wiredTiger引擎還支援document級別的lock。每個級別的鎖分為read和write鎖,其中read為共享鎖(S),write為排它鎖(X),意向共享鎖(IS)和意向排它鎖(IX)表示read或者write操作獲取更細粒度的資源的意圖,通常而言,如果lock是分級的、Tree結構的,那麼在高級別資源上使用意向鎖,在最終級別的資源上使用“共享鎖”或者“排它鎖”。
 
  在mongodb中,資源的鎖定級別(或次序)依次為:Global --> Database --> Collection--> Document,粒度逐漸變小,併發能力依次更強。 如果想獲取collection的write鎖( X,排他鎖),那麼必須在依次在Global 和相應的Database上獲取“意向排它鎖”(I), 如果這兩個級別上的IX鎖獲取成功,才能在Collection上“嘗試”獲取X鎖。對於同一個數 據庫,可以同時被IS、IX兩種模式鎖定,但是X鎖不能與其他模式相容,S鎖只能與IS模式相容。

5、什麼是儲存引擎?

它的職責就是如何在磁碟上儲存資料、管理資料;很多資料庫,可以支援多種儲存引擎,每種引擎可以在特定的使用場景下更加優秀,比如某個引擎可能在大量read操作中效能更高,還有引擎在大量write操作時支撐的併發量更大等等。比如mysq支援mysiam、innodb等。

mongodb目前支援MMAPv1和wiredTiger,在3.0+版本中支援wiredTiger,在3.0之前的版本預設引擎為MMAPv1;在3.2以及之後的版本,預設引擎為wiredTiger。

事務的定義:

  當多個使用者訪問同一份資料時,一個使用者在更改資料的過程中可能有其他使用者同時發起更改請求,為保證資料的更新從一個一致性狀        態變更為另一個一致性狀態,這時有必要引入事務的概念。

Mysql提供了多種引擎支援Innodb和BDB。Innodb儲存引擎事務主要通過UNDO日誌和REDO日誌實現,Myisam和memory引擎則不支援事務。

6、什麼是記憶體對映檔案?
memory-mapped檔案是作業系統通過mmap()系統呼叫將檔案資料載入記憶體,mmap()將檔案映 射到虛擬記憶體的一個區域(region)。記憶體對映檔案是MMAPv1引擎的核心。mongodb通過記憶體對映操作檔案內容就像它們在記憶體中一樣,因為整個檔案操作全部基於系統呼叫,mongodb不需要太多的檔案、記憶體管理,效能較高而且實施簡單。

記憶體對映檔案的工作方式:

記憶體對映將資料檔案直接以逐位元組對應的方式對映到一塊虛擬記憶體中,當mongodb訪問documents時將資料檔案對映到記憶體中,那些不被訪問的檔案不會被對映。一旦對映,檔案與記憶體的對映關係,就允許mongodb就像操作記憶體一樣直接與資料檔案互動。