mongodb可以輕鬆修改舊錶字段的原因

疑問

公司有用到mongodb數據庫,最近經常有需求要在原先已經存在大量數據的表中新增字段,所以想探究一下這樣子做的效率如何

mongodb的介紹

簡介

MongoDB是一個文檔數據庫,具有您所需的查詢和索引所需的可伸縮性和靈活性

體系結構

MongoDB 的邏輯結構是一種層次結構。主要由:

文檔(document)、集合(collection)、數據庫(database)這三部分組成的。邏輯結構是面向用戶的,用戶使用 MongoDB 開發應用程序使用的就是邏輯結構。
(1)MongoDB 的文檔(document),相當於關係數據庫中的一行記錄。
(2)多個文檔組成一個集合(collection),相當於關係數據庫的表。
(3)多個集合(collection),邏輯上組織在一起,就是數據庫(database)。
(4)一個 MongoDB 實例支持多個數據庫(database)。
文檔(document)、集合(collection)、數據庫(database)的層次結構如下圖:
在這裏插入圖片描述
下表是MongoDB與MySQL數據庫邏輯結構概念的對比
在這裏插入圖片描述
文檔介紹
MongoDB將數據存儲在靈活的、類似JSON(bson)的文檔中,這意味着各個文檔的字段可以不同,並且數據結構可以隨着時間的推移而改變。
這也是mongodb數據庫在舊的表(集合)上對數據結構進行修改但是沒有任何消耗的原因,因爲如果是新增字段,但是對舊的數據無影響,只對新的數據有影響,對mongodb數據庫而言舊錶無感知,但如果是mysql數據庫,表結構就得做相應的更改。

解答

mongodb數據庫以文檔的方式存儲數據,同一集合中各個文檔的的字段可以不同,所以新增字段如非業務必須,不需要對舊的字段做任何更改,所以相較於mysql數據庫能夠更輕鬆的支持在原有表上加字段。

mysql對比

mysql在線ddl的流程

A.對錶加鎖(表此時只讀)
B.複製原表物理結構
C.修改表的物理結構
D.把原表數據導入中間表中,數據同步完後,鎖定中間表,並刪除原表
E.rename中間表爲原表
F.刷新數據字典,並釋放鎖
在這個過程中會鎖表。造成當前操作的表無法寫入數據,影響用戶使用。由於需要複製原表的數據到中間表,所以表的數據量越大,等待的時候越長,卡死在那裏(用戶被拒絕執行update和insert操作,表現就是延遲了一直在等待)。
所以mysql給表加字段會給表加排他鎖,在修改的這個時間段用戶只能讀,不能寫,表的數據量越大,用戶無法正常使用服務的時間就越長。

參考文章:
https://www.jb51.net/article/154494.htm
https://www.cnblogs.com/wangtao_20/p/3504395.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章