---概念
非關係型數據庫也叫Nosql數據庫,關係型數據庫通過外鍵關聯來建立表與表之間的關係,而非關係型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關係通過每個對象自身的屬性來決定。例如,以鍵值對key-value存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會侷限於固定的結構,可以減少一些時間和空間的開銷。而且僅需要根據key取出相應的value就可以完成查詢,性能方面較關係型數據庫有很大提升。
---特點
模式自由
– 不需要定義表結構,數據表中的每條記錄都可能有不同的屬性和格式。
逆規範化
– 不遵循範式要求,去掉完整性約束,減少表之間的依賴
彈性可擴展
– 可在系統運行的過程中,動態的刪除和增加節點。
多副本異步複製
– 數據快速寫入一個節點,其餘節點通過讀取寫入的日誌來實現異步複製。
弱事務
– 不能完全滿足事務的ACID特性,但是可以保證事務的最終一致性。
---什麼時候用nosql非關係型數據庫
數據庫表schema經常變化
數據庫表字段是複雜數據類型
高併發數據庫請求
海量數據的分佈式存儲
以下彙總了3種nosql類型的數據庫的優化
第一、 mongodb
mongodb面向集合存儲,易存儲對象類型的數據,適合大數據量的存儲,主要解決海量數據的訪問效率問題,依賴操作系統 VM 做內存管理,吃內存也比較厲害,服務最好不要和別的服務在一起。mongoDB 不支持事務。
Linux下可以直接使用mongo進入mongod命令行
優化的點:
1,語句這塊的優化
a. 可以通過記錄profile來找到執行時間長的語句
(PS:Mongodb的profile就和mysql的慢查詢類似,用於記錄執行時間超過多少的語句。)
db.getProfilingLevel() # 獲取profile級別
db.setProfilingLevel(1,2000)# 設置profile級別
profile級別有三種:
– 0:不開啓
– 1:記錄慢命令,默認爲大於100ms
– 2:記錄所有命令
查詢profile記錄
– db.system.profile.find();
b. 找到執行時間長的語句後,explain解析這條語句,可以看到它有沒有使用索引,使用了什麼索引
語句爲:db.collection.find({xx:xx}).explain();
c.通過explain的結果來優化查詢語句
2,連接數
如果大併發下,連接數不夠,會導致程序連接不上mongodb,需要調大連接數
3,內存大點,或者把磁盤換成SSD
可視化工具:mongoVUE 圖形化界面監控:天兔 lepus
第二、 Redis
redis是一個開源的、使用C語言編寫的、支持網絡交互的、可基於內存也可持久化的Key-Value數據庫。Redis和mongodb的區別是redis數據全部存儲在內存中,使用磁盤僅用於數據的持久化,而mongodb數據是存儲在磁盤上。
優化的點:
1,連接數
2,緩存命中率
命中次數 / (命中次數 + 未命中次數)= 命中率
命中率低的原因
1,key失效時間過短
2,內存設置的過小,導致內存中數據存滿,redis自己清理了一些key,再去用key的時候,就找不到了
命令監控:(info命令)
可視化工具:RedisDesktopManager 圖形化界面監控:天兔 lepus
第三、 Memcached
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而大大提高讀取速度。
優化的點:
1,連接數
2,緩存命中率
命中次數 / (命中次數 + 未命中次數)= 命中率
命中率低的原因
1,key失效時間過短
2,內存設置的過小,導致內存中數據存滿,redis自己清理了一些key,再去用key的時候,就找不到了
命令監控:(stats命令)
圖形化界面監控:windows下修改phpmemcache.php(然後放到apache的htdocs工作目錄下,如果是lampp的話:/opt/lampp/htdocs)
然後訪問:http://IP地址:11211/mem/phpmemcache.php root root/123456(根據自己的設置)