這為什么會(huì)用mongo?這還用得著mysql?這你怎么用redis!!是我承認(rèn),上述問(wèn)題每個(gè)月都會(huì)在我的內(nèi)心中糾結(jié)那么一兩次,于是我痛下決心決定給自己定下一個(gè)標(biāo)準(zhǔn),什么時(shí)候用什么比較好。
1.讀寫(xiě)間的區(qū)別
①Redis
redis的數(shù)據(jù)是存放在服務(wù)器內(nèi)存的,當(dāng)內(nèi)存滿了以后就需要擴(kuò)容,采用redis分布式方案,為了防止redis數(shù)據(jù)丟失,可以調(diào)整redis配置,按照一定的策略將數(shù)據(jù)持久化到硬盤(pán)
②MongoDB
Mongo同時(shí)使用了內(nèi)存和硬盤(pán),采用MMAP機(jī)制對(duì)文件進(jìn)行讀寫(xiě),可以簡(jiǎn)單理解為將一部分映射到內(nèi)存,然后再?gòu)膬?nèi)存查
③Mysql
mysql毫無(wú)疑問(wèn)是存在硬盤(pán)的,就是這么硬
2.查找數(shù)據(jù)的區(qū)別
①Redis
redis采用鍵值對(duì)方式存數(shù)據(jù),有key值的時(shí)候直接查非???/p>
②MongoDB和Mysql
都支持Id(主鍵)和索引,當(dāng)用id和索引查的時(shí)候效率高,沒(méi)有id和索引的時(shí)候效率低,對(duì)于mysql索引可以看看《高性能Mysql》里面講的很詳細(xì)。
3.該如何選擇呢
①Redis
讀寫(xiě)速度快,但是內(nèi)存成本高,所以一般讀寫(xiě)頻率比較高且查找簡(jiǎn)單(Redis是key-value存儲(chǔ))的場(chǎng)景比較適合redis,比如用戶的身份驗(yàn)證信息。
②MongoDB
- 大尺寸,低價(jià)值
- 高伸縮性:多服務(wù)器組成的集群數(shù)據(jù)庫(kù)
- 存儲(chǔ)地理坐標(biāo):劃重點(diǎn),MongoDB的地理坐標(biāo)查詢功能非常強(qiáng)大,這個(gè)之前筆者也沒(méi)了解過(guò),稍后我們?cè)谙乱欢卧囋囘@個(gè)強(qiáng)大的地理坐標(biāo)查詢
- 不適用于高度事務(wù)和復(fù)雜SQL:雖然高版本mongo已經(jīng)支持了事務(wù),但是用起來(lái)還是沒(méi)有傳統(tǒng)關(guān)系型來(lái)的自在,所以遇到高度事務(wù)的場(chǎng)景還是不要給自己找麻煩了,用mysql。復(fù)雜查詢也是,mongoDB雖然支持查詢語(yǔ)句,但是跟mysql比查詢的能力還是不夠強(qiáng)大(可能是我沒(méi)用的很明白,不過(guò)歡迎在留言處進(jìn)行反駁)。
③Mysql
MongoDB不適用的場(chǎng)景就用mysql,沒(méi)錯(cuò)就是這樣。
4.MongoDB的地址查詢是什么,我已經(jīng)等不及了
①輸入沈陽(yáng)地點(diǎn)的坐標(biāo)百度坐標(biāo)拾取器大家也可以拾取自己家鄉(xiāng)的坐標(biāo)來(lái)玩
db.location.insert({"name":"市府廣場(chǎng)","coordinate":{"longitude":123.440708,"latitude":41.810372}})
db.location.insert({"name":"八一公園","coordinate":{"longitude":123.431399,"latitude":41.807845}})
db.location.insert({"name":"華府天地","coordinate":{"longitude":123.441639,"latitude":41.817177}})
db.location.insert({"name":"張士燈具城","coordinate":{"longitude":123.294777,"latitude":41.770025}})
②MongoDB的原生地理索引支持兩種,一個(gè)是平面的一個(gè)是球面的
- 平面索引
db.location.ensureIndex({'coordinate':'2d'})
- 球面索引
db.location.ensureIndex({'coordinate':'2dsphere'})
顯而易見(jiàn),追求精度的話使用球面查最準(zhǔn),如果距離跨度不大用平面查就可以。
③查詢一波
db.location.find({
"coordinate":{
//當(dāng)前點(diǎn)坐標(biāo)
"$near":[123.441363,41.82645],
//如果指定的點(diǎn)是GeoJSON,則以米為單位指定距離;如果指定的點(diǎn)是遺留坐標(biāo)對(duì),則以弧度為單位指定距離
"$maxDistance":0.1
}
})
得出的結(jié)果是沒(méi)有張士燈具城,坐標(biāo)查詢文檔
ok,就說(shuō)這些,歡迎大家指出文章的不足,已經(jīng)我認(rèn)識(shí)的不足,如果對(duì)你有幫助請(qǐng)點(diǎn)贊,謝謝(PHP是世界最好的語(yǔ)言沒(méi)有之一)