什么時(shí)候用Mongo

這為什么會(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)有之一)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容