1.MySQL與MongoDB的操作對(duì)比,以及區(qū)別
MySQL與MongoDB都是開源的常用數(shù)據(jù)庫(kù),但是MySQL是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),MongoDB則是非關(guān)系型數(shù)據(jù)庫(kù),也叫文檔型數(shù)據(jù)庫(kù),是一種NoSQL的數(shù)據(jù)庫(kù)。它們各有各的優(yōu)點(diǎn),關(guān)鍵是看用在什么地方。所以我們所熟知的那些SQL(全稱Structured Query Language)語(yǔ)句就不適用于MongoDB了,因?yàn)镾QL語(yǔ)句是關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。
以我們公司項(xiàng)目為例,在早期的項(xiàng)目中,都在使用關(guān)系型數(shù)據(jù)庫(kù),用過SQLServer,Oracle,DB2,后來(lái)全部轉(zhuǎn)向Mysql,原因很簡(jiǎn)單:Mysql在性能不錯(cuò)的情況下,有著開源優(yōu)勢(shì)。Mysql的事務(wù)性與高性能是我們主要考慮的。后來(lái),由于項(xiàng)目要用到用戶系統(tǒng),即會(huì)有大量的用戶數(shù)據(jù)進(jìn)行交互--海量存儲(chǔ),Mysql的讀寫速度會(huì)有一點(diǎn)瓶頸,于是我們就想到了最近發(fā)展很強(qiáng)勢(shì)的Nosql。在Nosql早期的memcache的發(fā)展下,又出現(xiàn)了很多非關(guān)系型數(shù)據(jù)庫(kù),比如redis,mongodb。經(jīng)過一段時(shí)間的測(cè)試,redis與mongodb的讀寫速度確實(shí)比Mysql有著很明顯的優(yōu)勢(shì)。mongodb的寫入速度大約2.5W/次每秒。
mongodb以BSON結(jié)構(gòu)(二進(jìn)制)進(jìn)行存儲(chǔ),對(duì)海量數(shù)據(jù)存儲(chǔ)有著很明顯的優(yōu)勢(shì)。下面是Mongodb與Mysql的操作命令的對(duì)比。
作用 MySQL MongoDB
服務(wù)器守護(hù)進(jìn)程 mysqld mongod
客戶端工具 mysql mongo
邏輯備份工具 mysqldump mongodump
邏輯還原工具 mysql mongorestore
數(shù)據(jù)導(dǎo)出工具 mysqldump mongoexport
數(shù)據(jù)導(dǎo)入工具 source mongoimport
新建用戶并授權(quán) grant all privileges on *.* db.addUser("user","psw")
to username@'localhost' db.auth("user","psw")
identified by 'passwd'
with grant option;
顯示庫(kù)列表 show databases; show dbs
進(jìn)去庫(kù) use dbname; use dbname
顯示表列表 show tables; show collections
查詢主從狀態(tài) show slave status; rs.status
創(chuàng)建庫(kù) create database name; 無(wú)需單獨(dú)創(chuàng)建,直接use進(jìn)去
創(chuàng)建表 create table tname(id int); 無(wú)需單獨(dú)創(chuàng)建,直接插入數(shù)據(jù)
刪除表 drop table tname; db.tname.drop()
刪除庫(kù) drop database dbname; 首先進(jìn)去該庫(kù),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 db.tname.update({id:2},
where 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 db.tname.find({id:2,
and name='steve'; name:'steve'})
條件查詢 select * from tname where id=2 db.tname.find($or:[{id:2},
or name='steve'; {name:'steve'}])
條件查詢 select * from tname limit 1; db.tname.findOne()
模糊查詢 select * from tname where name db.tname.find({name:/ste/})
like "%ste%";
模糊查詢 select * from tname where name db.tname.find({name:/^ste/})
like "ste%";
獲取表記錄數(shù) select count(id) from tname; db.tname.count()
獲取有條件 select count(id) from tname db.tname.find({id:2}).count()
的記錄數(shù) where id=2;
查詢時(shí)去掉 select distinct(last_name) db.tname.distinct('last_name')
重復(fù)值 from tname;
正排序查詢 select * from tname order by id; db.tname.find().sort({id:1})
逆排序查詢 select * from tname order by db.tname.find().sort({id:-1})
id desc;
取存儲(chǔ)路徑 explain select * from tname db.tname.find({id=3}).explain()
where id=3;
特別要注意的是:mongodb插入多個(gè)字段語(yǔ)法
> db.user.insert({id:1,name:'steve',sex:'male'}) 正確
> db.user.insert({id:2},{name:'bear'},{sex:'female'}) 錯(cuò)誤