MongoDB 與 Mysql 的對比

什麼是Mysql (詳細鏈接

MySQL是由Oracle公司開發,發佈和支持的受歡迎的開源關係數據庫管理系統(RDBMS)。像其餘關係系統同樣,MySQL將數據存儲在表中,並使用結構化查詢語言(SQL)來進行數據庫訪問。在MySQL中,您能夠根據須要預先定義數據庫模式,並設置規則來管理表中字段之間的關係。在MySQL中,相關信息可能存儲在單獨的表中,但經過使用關聯查詢來關聯。經過使用這種方式,使得數據重複量被最小化html

什麼是MongoDB (詳細鏈接

MongoDB是由MongoDB,Inc.開發的開源數據庫。MongoDB將數據存儲在相似JSON的文檔中,而且文檔中每一個json串結構可能有所不一樣。相關信息存儲在一塊兒,經過MongoDB查詢語言進行快速查詢訪問。 MongoDB使用動態模式,這意味着您能夠在不首先定義結構的狀況下建立記錄,例如字段或其值的類型。您能夠經過添加新字段或刪除現有記錄來更改記錄的結構(咱們稱之爲文檔)。該數據模型可讓您輕鬆地表明層次關係,存儲數組和其餘更復雜的結構。集合中的文檔不須要具備相同的一組字段,數據的非規範化是常見的。 MongoDB還設計了高可用性和可擴展性,並提供了即用型複製和自動分片功能。mysql

術語和概念

MySQL MongoDB
表 table 集合 collection
行 row 文檔 document
列 column 字段 field
錶鏈接 joins 嵌入文檔或者連接

語法對比

說明 MySQL MongoDB
顯示庫列表 show databases show dbs
使用庫 use mydb1; use mydb1
顯示錶列表 Show tables Show collections
建立表 Create table users(age int, sex int) db.people.insert({"name":"紫龍神","age",18}) ps:可隱式建立表
建立索引 Create INDEX idxname ON users(name) db.people.ensureIndex({name:1})
插入記錄 Insert into users values(1, 1) db.people.insert({"name":"紫龍神","age",18})
查詢表 Select * from users db.peple.find({"age":18})
查詢表 Select * from users db.people.find()
條件查詢 Select * from users where age=33 db.people.find({age:33})
條件查詢 select * from users where age<33 db.people.find({'age':{$lt:33}})
條件查詢 select * from users where age>33 and age<=40 db.people.find({'age':{gt:33,lte:40}})
條件查詢 select * from users where a=1 and b='q' db.people.find({a:1,b:'q'})
條件查詢 select * from users where a=1 or b=2 db.people.find( { $or:[ { a:1 } , { b:2 } ] } )
條件查詢 select * from users limit 1 db.people.findOne()
模糊查詢 select * from users where name like "%Joe%" db.people.find({name:/Joe/})
模糊查詢 select * from users where name like "Joe%" db.people.find({name:/^Joe/})
獲取表記錄數 select count(1) from users db.people.count()
獲取表記錄數 bug select count(1) from users where age>30 db.people.find({age: {$g':30}}.count()
去掉重複值 select DISTINCT last_name from users db.people.distinct('last_name')
排序(正序) select * from users ORDER BY name db.people.find().sort({name:1})
排序 (倒序) select * from users ORDER BY name DESC db.people.find().sort({name:-1})
更新記錄 update users set a=1 where b='q' db.people.update({b:'q'}, {$set:{a:1}}, false, true)
更新記錄 update users set a=a+2 where b='q' db.people.update({b:'q'}, {$inc:{a:2}}, false, true)
刪除記錄 delete from users where z="abc" db.people.remove({z:'abc'});db. people.remove() 刪除全部的記錄
刪除數據庫 drop database IF EXISTS test use test; db.dropDatabase()
刪除表/collection drop table IF EXISTS test db.mytable.drop()

應用場景對比

MongoDB:

更高的寫入負載

默認狀況下,MongoDB更側重高數據寫入性能,而非事務安全,MongoDB很適合業務系統中有大量「低價值」數據的場景。可是應當避免在高事務安全性的系統中使用MongoDB,除非能從架構設計上保證事務安全。git

高可用性

MongoDB的復副集(Master-Slave)配置很是簡潔方便,此外,MongoDB能夠快速響應的處理單節點故障,自動、安全的完成故障轉移。這些特性使得MongoDB能在一個相對不穩定(如雲主機)的環境中,保持高可用性。sql

數據量很大或者將來會變得很大

依賴數據庫(MySQL)自身的特性,完成數據的擴展是較困難的事,在MySQL中,當一個單達表到5-10GB時會出現明顯的性能降級,此時須要經過數據的水平和垂直拆分、庫的拆分完成擴展,使用MySQL一般須要藉助驅動層或代理層完成這類需求。而MongoDB內建了多種數據分片的特性,能夠很好的適應大數據量的需求。mongodb

基於位置的數據查詢

MongoDB支持二維空間索引,所以能夠快速及精確的從指定位置獲取數據。數據庫

表結構不明確,且數據在不斷變大

在一些傳統RDBMS中,增長一個字段會鎖住整個數據庫/表,或者在執行一個重負載的請求時會明顯形成其它請求的性能降級。一般發生在數據表大於1G的時候(當大於1TB時更甚)。 因MongoDB是文檔型數據庫,爲非結構貨的文檔增長一個新字段是很快速的操做,而且不會影響到已有數據。另一個好處當業務數據發生變化時,是將不在須要由DBA修改表結構。json

緩存

因爲性能很高,也適合做爲信息基礎設施的緩存層。在系統重啓以後,搭建的持久化緩存能夠避免下層的數據源過載。後端

Mongodb 應用案例

  • 京東,中國著名電商,使用MongoDB存儲商品信息,支持比價和關注功能.
  • 趕集網,中國著名分類信息網站,使用MongoDB記錄pv瀏覽計數
  • 奇虎360,著名病毒軟件防禦和移動應用平臺,使用MongoBD支撐的HULK平臺天天接受200億次的查詢.
  • 百度雲,使用MongoDB管理百度雲盤中500億條關於文件源信息的記錄.
  • CERN,著名的粒子物理研究所,歐洲核子研究中心大型強子對撞機的數據使用MongoDB
  • 紐約時報,領先的在線新聞門戶網站之一,使用MongoDB
  • sourceforge.net,資源網站查找,建立和發佈開源軟件免費,使用MongoDB的後端存儲

Mysql:

1)這些數據一般須要作結構化查詢,好比join,這時候,關係型數據庫就要勝出一籌數組

2)這些數據的規模、增加的速度一般是能夠預期的緩存

3)事務性、一致性(mongdodb4.0也開始支持事務了)

4)豐富的鎖機制

Mysql應用案例

高度事物性的系統

例如銀行或會計系統;傳統的關係型數據庫目前仍是更適用於須要大量原子性復瑣事務的應用程序。

傳統的商業智能應用

針對特定問題的BI數據庫會對產生高度優化的查詢方式。對於此類應用,數據倉庫多是更合適的選擇

推薦閱讀:

MongdoDB學習教程: https://piaosanlang.gitbooks.io/mongodb/
Mysql 優化十大技巧: http://www.javashuo.com/article/p-ejcnsyae-e.html

相關文章
相關標籤/搜索