MySQL是由Oracle公司開發,發佈和支持的受歡迎的開源關係數據庫管理系統(RDBMS)。像其餘關係系統同樣,MySQL將數據存儲在表中,並使用結構化查詢語言(SQL)來進行數據庫訪問。在MySQL中,您能夠根據須要預先定義數據庫模式,並設置規則來管理表中字段之間的關係。在MySQL中,相關信息可能存儲在單獨的表中,但經過使用關聯查詢來關聯。經過使用這種方式,使得數據重複量被最小化html
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':{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,除非能從架構設計上保證事務安全。git
MongoDB的復副集(Master-Slave)配置很是簡潔方便,此外,MongoDB能夠快速響應的處理單節點故障,自動、安全的完成故障轉移。這些特性使得MongoDB能在一個相對不穩定(如雲主機)的環境中,保持高可用性。sql
依賴數據庫(MySQL)自身的特性,完成數據的擴展是較困難的事,在MySQL中,當一個單達表到5-10GB時會出現明顯的性能降級,此時須要經過數據的水平和垂直拆分、庫的拆分完成擴展,使用MySQL一般須要藉助驅動層或代理層完成這類需求。而MongoDB內建了多種數據分片的特性,能夠很好的適應大數據量的需求。mongodb
MongoDB支持二維空間索引,所以能夠快速及精確的從指定位置獲取數據。數據庫
在一些傳統RDBMS中,增長一個字段會鎖住整個數據庫/表,或者在執行一個重負載的請求時會明顯形成其它請求的性能降級。一般發生在數據表大於1G的時候(當大於1TB時更甚)。 因MongoDB是文檔型數據庫,爲非結構貨的文檔增長一個新字段是很快速的操做,而且不會影響到已有數據。另一個好處當業務數據發生變化時,是將不在須要由DBA修改表結構。json
因爲性能很高,也適合做爲信息基礎設施的緩存層。在系統重啓以後,搭建的持久化緩存能夠避免下層的數據源過載。後端
1)這些數據一般須要作結構化查詢,好比join,這時候,關係型數據庫就要勝出一籌數組
2)這些數據的規模、增加的速度一般是能夠預期的緩存
3)事務性、一致性(mongdodb4.0也開始支持事務了)
4)豐富的鎖機制
例如銀行或會計系統;傳統的關係型數據庫目前仍是更適用於須要大量原子性復瑣事務的應用程序。
針對特定問題的BI數據庫會對產生高度優化的查詢方式。對於此類應用,數據倉庫多是更合適的選擇
MongdoDB學習教程: https://piaosanlang.gitbooks.io/mongodb/
Mysql 優化十大技巧: http://www.javashuo.com/article/p-ejcnsyae-e.html