這為什么會用mongo?這還用得著mysql?這你怎么用redis!斗幼!是我承認(rèn),上述問題每個月都會在我的內(nèi)心中糾結(jié)那么一兩次抚垄,于是我痛下決心決定給自己定下一個標(biāo)準(zhǔn)蜕窿,什么時候用什么比較好。
1.讀寫間的區(qū)別
①Redis
redis的數(shù)據(jù)是存放在服務(wù)器內(nèi)存的呆馁,當(dāng)內(nèi)存滿了以后就需要擴(kuò)容桐经,采用redis分布式方案,為了防止redis數(shù)據(jù)丟失浙滤,可以調(diào)整redis配置阴挣,按照一定的策略將數(shù)據(jù)持久化到硬盤
②MongoDB
Mongo同時使用了內(nèi)存和硬盤,采用MMAP機(jī)制對文件進(jìn)行讀寫,可以簡單理解為將一部分映射到內(nèi)存纺腊,然后再從內(nèi)存查
③Mysql
mysql毫無疑問是存在硬盤的畔咧,就是這么硬
2.查找數(shù)據(jù)的區(qū)別
①Redis
redis采用鍵值對方式存數(shù)據(jù),有key值的時候直接查非骋灸ぃ快
②MongoDB和Mysql
都支持Id(主鍵)和索引誓沸,當(dāng)用id和索引查的時候效率高,沒有id和索引的時候效率低壹粟,對于mysql索引可以看看《高性能Mysql》里面講的很詳細(xì)拜隧。
3.該如何選擇呢
①Redis
讀寫速度快,但是內(nèi)存成本高趁仙,所以一般讀寫頻率比較高且查找簡單(Redis是key-value存儲)的場景比較適合redis洪添,比如用戶的身份驗證信息。
②MongoDB
- 大尺寸幸撕,低價值
- 高伸縮性:多服務(wù)器組成的集群數(shù)據(jù)庫
- 存儲地理坐標(biāo):劃重點薇组,MongoDB的地理坐標(biāo)查詢功能非常強(qiáng)大,這個之前筆者也沒了解過坐儿,稍后我們在下一段試試這個強(qiáng)大的地理坐標(biāo)查詢
- 不適用于高度事務(wù)和復(fù)雜SQL:雖然高版本mongo已經(jīng)支持了事務(wù)律胀,但是用起來還是沒有傳統(tǒng)關(guān)系型來的自在宋光,所以遇到高度事務(wù)的場景還是不要給自己找麻煩了,用mysql炭菌。復(fù)雜查詢也是罪佳,mongoDB雖然支持查詢語句,但是跟mysql比查詢的能力還是不夠強(qiáng)大(可能是我沒用的很明白黑低,不過歡迎在留言處進(jìn)行反駁)赘艳。
③Mysql
MongoDB不適用的場景就用mysql,沒錯就是這樣克握。
4.MongoDB的地址查詢是什么蕾管,我已經(jīng)等不及了
①輸入沈陽地點的坐標(biāo)百度坐標(biāo)拾取器大家也可以拾取自己家鄉(xiāng)的坐標(biāo)來玩
db.location.insert({"name":"市府廣場","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的原生地理索引支持兩種,一個是平面的一個是球面的
- 平面索引
db.location.ensureIndex({'coordinate':'2d'})
- 球面索引
db.location.ensureIndex({'coordinate':'2dsphere'})
顯而易見,追求精度的話使用球面查最準(zhǔn)菩暗,如果距離跨度不大用平面查就可以掰曾。
③查詢一波
db.location.find({
"coordinate":{
//當(dāng)前點坐標(biāo)
"$near":[123.441363,41.82645],
//如果指定的點是GeoJSON,則以米為單位指定距離;如果指定的點是遺留坐標(biāo)對停团,則以弧度為單位指定距離
"$maxDistance":0.1
}
})
得出的結(jié)果是沒有張士燈具城旷坦,坐標(biāo)查詢文檔
ok,就說這些,歡迎大家指出文章的不足佑稠,已經(jīng)我認(rèn)識的不足秒梅,如果對你有幫助請點贊,謝謝(PHP是世界最好的語言沒有之一)