我為什麼放棄MySQL?選擇了MongoDB
最近有個專案的功能模組,為了處理方便,需要操作集合型別的資料以及其他原因。考慮再三最終決定放棄使用MySQL,而選擇MongoDB。
兩個資料庫,大家應該都不陌生。他們最大的區別就是MySQL為關係型資料庫,而MongoDB為非關係型資料庫。常見的關係型資料庫有:MySQL、Oracle、DB2、SQL Server、Postgre SQL等,非關係型資料庫有MongoDB、Redis、Memcached、HBse等等。
關係型資料庫可以理解為依賴一個模型來建立的資料庫,比如我們使用的MySQL中的表是由橫列和縱列組成的一個二維表格。關係型資料庫可以透過關係模型使多個表的資料關聯起來,比如我們平時說的 一對一、一對多、多對一。由於是建立在資料模型的基礎上,所以我們可以透過SQL語句很方便的在多個表之間做複雜的查詢操作。關係型資料庫相對安全,因為直接儲存在硬碟中所以突然的當機、停電等意外不會導致資料丟失。MySQL的儲存方式是由自身的引擎決定的,常用的引擎有Innodb和MyISAM。他們主要的區別就是MyISAM 不支援事務,強調的是效能,執行速度比Innodb要快,Innodb提供支援事務等高階資料庫功能。
非關係型資料庫即我們常說的NoSQL資料庫,部署起來都比較簡單,沒有關係型資料庫那麼複雜。Mongo的儲存方式為虛擬記憶體+持久化儲存,Mongo將資料寫入記憶體中,再由虛擬記憶體管理器將其持久化到硬碟中,因此寫操作會比關係型資料庫快很多。NOSQL的儲存格式是key-value形式,可以像關係型資料庫那樣儲存基礎資料型別的資料,也可以儲存集合、物件等等。NoSQL雖然效能比較高,但是並不支援事物,也不能進行聯表查詢,一般用於較大規模資料的儲存。
2 他們的優點、缺點有哪些
關係型資料庫發展了很長一段時間,擁有非常成熟的體系。所佔份額也在逐漸增加。而且支援事物的操作,保證資料的一致性,可以透過SQL語句完成複雜的操作。但是使用過程中當資料量到達一定程度時,關係型資料庫的效率會有明顯的下降。一個複雜的查詢操作,一系列的組合索引都會消耗非常多的記憶體空間,此時我們需要對資料庫進行讀寫分離操作,或者將資料庫結構進行拆分(水平拆分、垂直拆分)將請求壓力分擔在不同的庫中。
垂直拆分是指將一張表拆分成多個表,表之間透過主鍵進行關聯。
水平拆分是按照某種規則拆分成多個表,比如透過使用者角色進行拆分
讀寫分離:所謂讀寫分離就是講讀操作(查詢資料)和寫操作(插入&更新)指向不同的資料庫節點,他們中間透過某種機制實現資料的同步,如binlog。實際的應用中大部分壓力還是來自讀操作,所以主要是一主多從的架構。
非關係型資料庫發展的這幾年,深受人們的喜愛。免費開源、成本低、部署簡單、非結構化儲存等等明顯的優勢。而且它對海量資料處理能力非常強,記憶體級資料庫,查詢速度也非常快。儲存的資料格式比較豐富,易於擴充套件,雖然不能使用sql進行復雜的查詢,但是MongoDB支援JavaScript,所以可以透過js指令碼進行復雜的資料庫管理操作。關於NoSQL的缺點個人感覺目前就是不支援事物了吧,其他方面那都不是事兒。
Mongo是用c++編寫的,支援多種語言如:Java、Python、Ruby、PHP、C++、C# 等,有時候針對不同的業務需求,選擇Mongo能夠避免浪費很多不必要的資源
日誌系統
系統執行過程中產生的日誌資訊,一般種類較多、範圍較大、內容也比較雜亂。透過MongoDB可以將這些雜亂的日誌進行收集管理。不僅方便了管理,查詢或者匯出也會變得非常容易
地理位置儲存
MongoDB支援地理位置、二維空間索引,可以儲存經緯度,因此可以很快的計算出兩點之間的距離,等位置資訊。如查詢附近的人、或者訂餐系統、配送系統等
資料規模增長很快
前面提到過關係型資料庫資料量過大時,需要進行分庫分表,這樣真正操作起來可能會比較麻煩。如果選擇mongo進行分庫分表操作時,就會變得很簡單。
保證高可用的環境
Mongo本身就擁有高可用及分割槽的解決方案,設定主從伺服器非常方便,除此之外Mongo還可以快速並且安全的實現故障節點的轉移。
檔案儲存需求
GridFS是MongoDB規範,用於儲存和檢索圖片、音訊、影片等大檔案。GridFS雖然是檔案儲存的一種方式,可以儲存超過16M的檔案。但是它本身又是儲存在MongoDB集合中的
其他場景
如遊戲開發中我們可以透過MongoDB儲存使用者資訊、裝備、積分等,除此之外物流系統、社交系統、甚至物聯網系統,Mongo都能提供完美的資料儲存服務。
關於兩個資料的效能,最有力的的說話還是透過實踐來進行測試,網上看到一組測試資料,分享給大家。
測試環境:Windows 10、記憶體8G、CPU i5 3.30GHZ。均無索引
測試語言:Python
連結工具:pymysql、pymongo
MySQL && Mongo 測試資料統計
提交次數 | 單次提交個數 | MySQL執行時間(s) | Mongo執行時間(s) | 資料量 | |
---|---|---|---|---|---|
1 | 1000 | 10000 | 3912 | 1622.02 | 0 |
2 | 100 | 100 | 30 | 1.61 | 1000萬 |
3 | 100 | 100 | 5.77 | 1.60 | 0 |
4 | 10 | 25 | 2.35 | 1.56 | 0 |
5 | 10 | 25 | 7.42 | 1.60 | 1000萬 |
6 | 10000 | 1 | 298.07 | 5.29 | 0 |
7 | 10000 | 1 | 496.18 | 5.29 | 1000萬 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562041/viewspace-2286395/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼很多SpringBoot開發者放棄了Tomcat,選擇了UndertowSpring BootTomcat
- 為什麼都放棄了LangChain?LangChain
- 為什麼5000+企業放棄Sonatype,選擇JFrog Artifactory
- [譯] 為什麼我放棄了 React 而轉向 Vue。ReactVue
- 為什麼華為、百度紛紛選擇OKR,放棄KPI?OKRKPI
- 為什麼我們放棄 Python 而選擇 Go?(getstream.io 的架構變遷)PythonGo架構
- 為什麼我們放棄了 Vue?Vue 和 React 深度對比VueReact
- 為什麼放棄jQueryjQuery
- 為什麼 husky 放棄了傳統的 JS 配置JS
- 我放棄了MVP - mironovMVP
- 我為什麼在最後一刻放棄了近視眼手術
- 既然有MySQL了,為什麼還要有MongoDB?MySqlMongoDB
- 第二次放棄offer,我選擇學習。
- Airbnb:ReactNative從選擇到放棄AIReact
- 我選擇了MySQL和SpringData JPAMySqlSpring
- 你當初為什麼選擇了前端?前端
- Airbnb: React Native 從選擇到放棄AIReact Native
- mysql 為什麼很多網際網路公司選擇了讀可提交MySql
- 為什麼大家現在放棄使用Excel,而選擇第三方報表工具呢?Excel
- 為什麼要在2021年放棄ExpressJS -DEVExpressJSdev
- 我為什麼選擇成為獨立開發者
- 為什麼選擇.NETCore?NetCore
- 放棄遊戲業務 迪士尼的神奇魔法為什麼不靈了?遊戲
- 為什麼我會選擇走 Java 這條路?Java
- 我們為什麼選擇VUE來構建前端Vue前端
- 為什麼放棄精準測試平臺?
- 為什麼 Vue3 選擇了 CSS 變數VueCSS變數
- 為什麼我們放棄使用Kafka Streams實現全部的事件溯源?-MateuszKafka事件
- 為什麼運維管理皮膚我只選擇它?運維
- Aembit為什麼選擇 Rust?Rust
- 為什麼選擇使用Rust?Rust
- 為什麼選擇Guice框架GUI框架
- GitHub:我們為什麼會棄用jQuery?GithubjQuery
- 為什麼 Ubuntu 放棄 Unity?創始人如是說UbuntuUnity
- 因為這個好用便籤,我放棄了紙質便籤
- Linux運維管理皮膚為什麼我只選擇它?Linux運維
- 為什麼選擇高防DNS?DNS
- 為什麼選擇centos系統CentOS