標籤:
MySQL與MongoDB都是開源的常用資料庫,但是MySQL是傳統的關係型資料庫,MongoDB則是非關係型資料庫,也叫文檔型資料庫,是一種NoSQL的資料庫。它們各有各的優點,關鍵是看用在什麼地方。所以我們所熟知的那些SQL(全稱Structured Query Language)語句就不適用於MongoDB了,因為SQL語句是關係型資料庫的標準語言。
以我們公司項目為例,在早期的項目中,都在使用關係型資料庫,用過SQLServer,Oracle,DB2,後來全部轉向Mysql,原因很簡單:Mysql在效能不錯的情況下,有著開源優勢。Mysql的事務性與高效能是我們主要考慮的。後來,由於項目要用到使用者系統,即會有大量的使用者資料進行互動--海量儲存,Mysql的讀寫速度會有一點瓶頸,於是我們就想到了最近發展很強勢的Nosql。在Nosql早期的memcache的發展下,又出現了很多非關係型資料庫,比如redis,mongodb。經過一段時間的測試,redis與mongodb的讀寫速度確實比Mysql有著很明顯的優勢。mongodb的寫入速度大約2.5W/次每秒。 mongodb以BSON結構(二進位)進行儲存,對海量資料存放區有著很明顯的優勢。下面是Mongodb與Mysql的操作命令的對比。
作用 |
MySQL |
MongoDB |
|
|
|
伺服器守護進程 |
mysqld |
mongod |
用戶端工具 |
mysql |
mongo |
邏輯備份工具 |
mysqldump |
mongodump |
邏輯還原工具 |
mysql |
mongorestore |
資料匯出工具 |
mysqldump |
mongoexport |
資料匯入工具 |
source |
mongoimport |
|
|
|
建立使用者並授權 |
grant all on *.* to [email protected]‘localhost‘ identified by ‘passwd‘; |
db.addUser("user","psw") db.auth("user","psw") |
顯示庫列表 |
show databases; |
show dbs |
進去庫 |
use dbname; |
use dbname |
顯示表列表 |
show tables; |
show collections |
查詢主從狀態 |
show slave status; |
rs.status |
建立庫 |
create database name; |
無需單獨建立,直接use進去 |
建立表 |
create table tname(id int); |
無需單獨建立,直接插入資料 |
刪除表 |
drop table tname; |
db.tname.drop() |
刪除庫 |
drop database dbname; |
首先進去該庫,db.dropDatabase() |
|
|
|
插入記錄 |
insert into tname(id) value(2); |
db.tname.insert({id:2}) |
刪除記錄 |
delete from tname where id=2; |
db.tname.remove({id:2}) |
修改/更新記錄 |
update tname set id=3 where id=2; |
db.tname.update({id:2}, {$set:{id:3}},false,true) |
|
|
|
查詢所有記錄 |
select * from tname; |
db.tname.find() |
查詢所有列 |
select id from tname; |
db.tname.find({},{id:1}) |
條件查詢 |
select * from tname where id=2; |
db.tname.find({id:2}) |
條件查詢 |
select * from tname where id < 2; |
db.tname.find({id:{$lt:2}}) |
條件查詢 |
select * from tname where id >=2; |
db.tname.find({id:{$gte:2}}) |
條件查詢 |
select * from tname where id=2 and name=‘steve‘; |
db.tname.find({id:2, name:‘steve‘}) |
條件查詢 |
select * from tname where id=2 or name=‘steve‘; |
db.tname.find($or:[{id:2}, {name:‘steve‘}]) |
條件查詢 |
select * from tname limit 1; |
db.tname.findOne() |
|
|
|
模糊查詢 |
select * from tname where name like "%ste%"; |
db.tname.find({name:/ste/}) |
模糊查詢 |
select * from tname where name like "ste%"; |
db.tname.find({name:/^ste/}) |
|
|
|
擷取表記錄數 |
select count(id) from tname; |
db.tname.count() |
擷取有條件 的記錄數 |
select count(id) from tname where id=2; |
db.tname.find({id:2}).count() |
查詢時去掉 重複值 |
select distinct(last_name) from tname; |
db.tname.distinct(‘last_name‘) |
|
|
|
正排序查詢 |
select *from tname order by id; |
db.tname.find().sort({id:1}) |
逆排序查詢 |
select *from tname order by id desc; |
db.tname.find().sort({id:-1}) |
|
|
|
取儲存路徑 |
explain select * from tname where id=3; |
db.tname.find({id=3}).explain() |
特別要注意的是:mongodb插入多個欄位文法> db.user.insert({id:1,name:‘steve‘,sex:‘male‘}) 正確> db.user.insert({id:2},{name:‘bear‘},{sex:‘female‘}) 錯誤
MySQL與MongoDB的操作對比,以及區別