這篇文章帶給大家的內容是關於從MongoDB開始淺談資料庫的知識,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
今天的主題是從MongoDB漫談資料庫,在日常的專案中,我們一般都是使用的mysql作為資料庫,但是一旦有問題,又常常會聽到類似「要不換成MongoDB試試」的聲音,因此就讓我們這些小白來隨便聊聊資料庫
什麼是資料庫
我們就用最簡單的話來說,資料庫,就是保存資料的一個倉庫
資料庫(Database)的基本概念
資料庫就是依照一定的資料結構來組織,儲存和管理資料的倉庫
-
#我們寫的程式都是在記憶體中運行的,一旦程式運行結束或電腦斷點,程式運行中的資料就會全部遺失;所以我們就需要將一些程式的資料持久化到鍵盤之中,以確保資料的安全性。
資料庫則是大批量資料持久化的普遍選擇,1.檔案2.資料庫
為什麼用資料庫儲存資料
#資料庫流行度(資料來源:https://db-engines.com /en/ranking)
從統計的資料可以看出,最受歡迎的DBMS是“關係型”,前五名中佔據了四位,把資料擴大到前十,關係型資料庫也佔了七位之多。
為什麼大多數程式設計師喜歡使用MySQL?
那麼關係型資料庫這麼好為什麼前五名中還會出現MongoDB的身影呢,我們來看看
關聯式資料庫和MySQL的缺點是什麼?
可擴展性:向特定記錄添加更多資料可能涉及擴展到多個表,列和行,而因為資料是按行存儲,即使只針對其中某一列進行運算,關係型資料庫也會將整行資料從儲存裝置讀入內存,導致I/O較高
由第一條產生而來的一個缺陷就是無法儲存資料結構
速度:由於資料結構的問題倒是分析資料時需要一定的時間,另外只能夠進行子字串的匹配查詢,當表的資料逐漸變大的時候,like查詢的匹配會非常慢,即使在有索引的情況下
在使用之前,需要先編寫架構以定義表,同時表結構schema擴展不方便如要需要修改表格結構,需要執行執行DDL(data definition language),語句修改,修改期間會導致鎖定表
是什麼讓MongoDB如此吸引人?
彈性:文件結構更符合開發人員在各自程式語言中的編碼方式,這些程式語言在鍵值對中是清晰且結構化的,這樣可以隨時輕鬆添加和編輯資料/文件
支援各種查詢:字段,表達式,範圍查詢,JavaScript函數等
更快的周轉時間:因為儲存在MySQL資料庫中的多個表中的相關資料儲存在MongoDB中的相同文件中
沒有嚴格的模式:可以在定義文件結構之前先建立文件
MongoDB的功能讓它更適合處理大量資料
#先讓我們來比較一下兩者再來詳細說明
|
MySQL |
MongoDB |
##版本 | 1995- 2018(mysql 8.0) | 2009 |
結構 | 關係型 | #非關係型 |
彈性 | 弱,需要在使用之前先定義資料庫模式 | #與MySQL相比具有相當大的彈性- 定義不需要的模式 |
可擴展性 | 可以,但比較困難,MySQL資料庫可以垂直擴展,可以在單一伺服器上增加更多資源 | 比MySQL更具可擴展性。 MongoDB可水平擴展,可以添加更多伺服器來擴展您的資料庫 |
需要DB管理員 | 是 | 否- 開發人員和管理員都可以使用 |
適用場景 | 會計師事務所和銀行,以及需要具有清晰架構的結構化資料的其他公司。非常適合具有或多或少固定要求的企業(twitter例外) | 具有實時數據,物聯網,內容管理,移動應用,社交網絡,面向大數據/網絡分析的系統以及不需要具有清晰架構或其架構的結構化資料的業務的理想選擇不斷變化 |
靈活性
首先說說靈活性,舉個列子,一個商城裡面會有許多的商品,而這些商品都是有自己獨特的屬性的,比如電視有屏幕尺寸、屏幕分辨率,而空調有製冷類型、外機噪音等屬性,要把它們放到產品表裡是非常困難的,額外增加了程式設計師對於資料表設計的工作,而MongoDB沒有Schema(模式、資料模型)就會顯得很簡單。
MongoDB 的靈活也體現在非結構化和半結構化的資料上。 MongoDB 提供全文索引,也支援地理位置查詢和索引。例如一位使用者想知道方圓五公里哪裡有公共衛生間,這是「地理範圍查詢」。然後他搜尋最近的單車。摩拜單車正是使用 MongoDB 完成這樣的「距離排序查詢」。
可擴展性
資料一台機器放不下了,就需要sharding(分片)把它放到好幾台機器上去。分片是MongoDB多年以來的原生功能,與MongoDB其他功能高效整合。
例如,分片叢集中一個複雜的聚合查詢會自動地根據Shard Key(片鍵)分配到多個結點上運行,盡可能將計算任務下推到資料結點上,最後在一個結點上聚合所有結點的結果。分片還可以在各個結點間自動遷移數據,均衡其數據量。同時配合MongoDB的複製(副本集)技術,可以有效的避免資料的遺失(在測試的時候發現mongo會自動發現副本集的所有機器位址,當一台Mongo被停掉時,連接的Server不會報錯)
MongoDB中使用分片群集結構分佈:
MongoDB的缺點
什麼時候選擇MongoDB
說了這麼多狗屁一樣總結的話,最重要的就是我們在什麼時候選擇使用MongoDB
日誌系統,系統運作過程中產生的日誌訊息,一般種類較多、範圍較大、內容也較雜亂。透過MongoDB可以將這些雜亂的日誌進行收集管理
地理位置存儲,MongoDB支援地理位置、二維空間索引,可以儲存經緯度,因此可以很快的計算出兩點之間的距離,等位置資訊
資料規模成長很快(例如供給的關注資訊)
需要保證高可用的環境
檔案儲存需求
其他場景,如遊戲開發中可以透過MongoDB儲存使用者資訊、裝備、積分等,除此之外物流系統、社交系統、甚至物聯網系統
資料庫的類型
#說了這麼多,為什麼我們會把mysql和MongoDB放在一起比較進行選擇,就是因為它們是不同類型的資料庫,從資料庫發展至今,大致上分為三種類型
RDBMS(關係型資料庫)
#首先要提到的一定是我們最熟悉的mysql資料庫所屬於的關係型資料庫。
關聯式資料庫的特性:
#Nosql (非關係型資料庫)
NoSql,也就是MongoDB的資料庫類型,源自於2009年在San Francisco舉辦的一次Meetup,在該Meetup上出現了NoSql技術的描述:open source, distributed, non relational databases
############################ #####非關係型資料庫的特性:############沒有行、列的概念用json類別儲存資料###########集相當於“表”,文件相當於“行”############標準化和非標準化的摩擦。 ############標準化限制創新,非標準話不能統一#############NoSql在剛提出的時候被解釋成Non-Relational,也有No-sql的意思,但隨著近些年的快速發展,SQL已經逐步被應用在了更廣泛的領域,因此,SQL已不再是RDBMS的專屬特徵,NoSql技術體系中也引入了SQL能力,因此而演變出來了Not-Only-SQL的概念######大多數NoSql技術,弱化了對ACID語義以及複雜關聯查詢的支持,採用了更簡潔或更專業的資料模型,優化了讀寫路徑,從而能夠換取更高的讀寫效能######NewSql######根據wiki中的定義###
NewSQL is a class of modern relational database management systems that seek to provide the same scalable performance of NoSQL systems for online transscalable (formance) of NoSQL systems for online OLTP) read-write workloads while still maintaining the ACID guarantees of a traditional database system.
NewSql可以說是傳統的RDBMS與NoSql技術結合之下的產物,因此,可以將典型NewSql技術理解成分佈式關係型資料庫,能夠支援分散式事務是一個基本前提。 NoSQL與NewSQL在技術堆疊上有許多重疊,但在是否支援關係型模型及對複雜事務的支援力度上是存在明顯差異的。因為本人不了解,所以這裡不做多說。
這裡我只是簡單的介紹一下資料庫的類型,對於一種儲存技術屬於NoSql或NewSql,亦或是RDBMS是不能簡單歸類的,畢竟技術是在不斷進步的,例如MySQL現在也相容了nosql的特性:
或有的人會奇怪為什麼在介紹MongoDB的缺點時沒有提事務的事,這是因為在在2018年夏季的MongoDB4.0版本中,MongoDB引入了事務功能,支援多文檔ACID特性,例如使用mongo shell進行事務操作
具體壓測數據後期補上
以上是從MongoDB開始淺談資料庫的知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!