我爲何放棄MySQL?選擇了MongoDB

 最近有個項目的功能模塊,爲了處理方便,須要操做集合類型的數據以及其餘緣由。考慮再三最終決定放棄使用MySQL,而選擇MongoDB。mysql

    兩個數據庫,你們應該都不陌生。他們最大的區別就是MySQL爲關係型數據庫,而MongoDB爲非關係型數據庫。常見的關係型數據庫有:MySQL、Oracle、DB二、SQL Server、Postgre SQL等,非關係型數據庫有MongoDB、Redis、Memcached、HBse等等。c++

 1.關係型數據庫? 非關係型數據庫?

關係型數據庫能夠理解爲依賴一個模型來建立的數據庫,好比咱們使用的MySQL中的表是由橫列和縱列組成的一個二維表格。關係型數據庫能夠經過關係模型使多個表的數據關聯起來,好比咱們平時說的  一對1、一對多、多對一。因爲是創建在數據模型的基礎上,因此咱們能夠經過SQL語句很方便的在多個表之間作複雜的查詢操做。關係型數據庫相對安全,由於直接存儲在硬盤中因此忽然的宕機、停電等意外不會致使數據丟失。MySQL的存儲方式是由自身的引擎決定的,經常使用的引擎有Innodb和MyISAM。他們主要的區別就是MyISAM 不支持事務,強調的是性能,執行速度比Innodb要快,Innodb提供支持事務等高級數據庫功能。sql

2.他們的優勢、缺點有哪些

  關係型數據庫發展了很長一段時間,擁有很是成熟的體系。所佔份額也在逐漸增長。並且支持事物的操做,保證數據的一致性,能夠經過SQL語句完成複雜的操做。可是使用過程當中當數據量到達必定程度時,關係型數據庫的效率會有明顯的降低。一個複雜的查詢操做,一系列的組合索引都會消耗很是多的內存空間,此時咱們須要對數據庫進行讀寫分離操做,或者將數據庫結構進行拆分(水平拆分、垂直拆分)將請求壓力分擔在不一樣的庫中。數據庫

垂直拆分是指將一張表拆分紅多個表,表之間經過主鍵進行關聯。安全

水平拆分是按照某種規則拆分紅多個表,好比經過用戶角色進行拆分服務器

讀寫分離:所謂讀寫分離就是講讀操做(查詢數據)和寫操做(插入&更新)指向不一樣的數據庫節點,他們中間經過某種機制實現數據的同步,如binlog。實際的應用中大部分壓力仍是來自讀操做,因此主要是一主多從的架構。架構

    非關係型數據庫發展的這幾年,深受人們的喜好。免費開源、成本低、部署簡單、非結構化存儲等等明顯的優點。並且它對海量數據處理能力很是強,內存級數據庫,查詢速度也很是快。存儲的數據格式比較豐富,易於擴展,雖然不能使用sql進行復雜的查詢,可是MongoDB支持JavaScript,因此能夠經過js腳本進行復雜的數據庫管理操做。關於NoSQL的缺點我的感受目前就是不支持事物了吧,其餘方面那都不是事兒。工具

3.何時用mongo

                                          

 

Mongo是用c++編寫的,支持多種語言如:Java、Python、Ruby、PHP、C++、C# 等,有時候針對不一樣的業務需求,選擇Mongo可以避免浪費不少沒必要要的資源性能

 

日誌系統測試

    系統運行過程當中產生的日誌信息,通常種類較多、範圍較大、內容也比較雜亂。經過MongoDB能夠將這些雜亂的日誌進行收集管理。不只方便了管理,查找或者導出也會變得很是容易

地理位置存儲

    MongoDB支持地理位置、二維空間索引,能夠存儲經緯度,所以能夠很快的計算出兩點之間的距離,等位置信息。如查詢附近的人、或者訂餐系統、配送系統等

數據規模增加很快

    前面提到過關係型數據庫數據量過大時,須要進行分庫分表,這樣真正操做起來可能會比較麻煩。若是選擇mongo進行分庫分表操做時,就會變得很簡單。

保證高可用的環境

Mongo自己就擁有高可用及分區的解決方案,設置主從服務器很是方便,除此以外Mongo還能夠快速而且安全的實現故障節點的轉移。

文件存儲需求

GridFS是MongoDB規範,用於存儲和檢索圖片、音頻、視頻等大文件。GridFS雖然是文件存儲的一種方式,能夠存儲超過16M的文件。可是它自己又是存儲在MongoDB集合中的

其餘場景

如遊戲開發中咱們能夠經過MongoDB存儲用戶信息、裝備、積分等,除此以外物流系統、社交系統、甚至物聯網系統,Mongo都能提供完美的數據存儲服務。

4.MySQL、MongoDB簡單的性能測試

關於兩個數據的性能,最有力的的說話仍是經過實踐來進行測試,網上看到一組測試數據,分享給你們。

測試環境:Windows 十、內存8G、AMDRyzen7 1700 3.65GHz。均無索引

測試語言: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萬
相關文章
相關標籤/搜索