什么是NoSQL
NoSQL,指的是非關(guān)系型的數(shù)據(jù)庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)的統(tǒng)稱,它具有非關(guān)系型、分布式、不提供ACID的數(shù)據(jù)庫設(shè)計模式等特征。
NoSQL用于超大規(guī)模數(shù)據(jù)的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲不需要固定的模式,無需多余操作就可以橫向擴(kuò)展。
SQL 和 NoSQL 的區(qū)別
SQL數(shù)據(jù)庫適合那些需求確定和對數(shù)據(jù)完整性要去嚴(yán)格的項目。NoSQL數(shù)據(jù)庫適用于那些對速度和可擴(kuò)展性比較看重的那些不相關(guān)的,不確定和不斷發(fā)展的需求。簡單來說就是:
- SQL是精確的。它最適合于具有精確標(biāo)準(zhǔn)的定義明確的項目。典型的使用場景是在線商店和銀行系統(tǒng)。
- NoSQL是多變的。它最適合于具有不確定需求的數(shù)據(jù)。典型的使用場景是社交網(wǎng)絡(luò),客戶管理和網(wǎng)絡(luò)分析系統(tǒng)。
SQL和Nosql的選型和比較
1.關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫
SQL (Structured Query Language) 數(shù)據(jù)庫,指關(guān)系型數(shù)據(jù)庫。主要代表:SQL Server,Oracle,MySQL等。
NoSQL(Not Only SQL)泛指非關(guān)系型數(shù)據(jù)庫,主要代表:MongoDB,Redis等。
2.關(guān)系型數(shù)據(jù)庫適合存儲結(jié)構(gòu)化數(shù)據(jù)
如用戶的帳號、地址等:
1)這些數(shù)據(jù)通常需要做結(jié)構(gòu)化查詢,比如join,這時候,關(guān)系型數(shù)據(jù)庫就要勝出一籌
2)這些數(shù)據(jù)的規(guī)模、增長的速度通常是可以預(yù)期的
3)保證數(shù)據(jù)的事務(wù)性、一致性要求。
3.NoSQL適合存儲非結(jié)構(gòu)化數(shù)據(jù)
如發(fā)微博、文章、評論:
1)這些數(shù)據(jù)通常用于模糊處理,如全文搜索、機(jī)器學(xué)習(xí)
2)這些數(shù)據(jù)是海量的,而且增長的速度是難以預(yù)期的,
3)根據(jù)數(shù)據(jù)的特點,NoSQL數(shù)據(jù)庫通常具有***(至少接近)伸縮性
4)按key獲取數(shù)據(jù)效率很高,但是對join或其他結(jié)構(gòu)化查詢的支持就比較差
目前許多大型互聯(lián)網(wǎng)項目都會選用MySQL(或任何關(guān)系型數(shù)據(jù)庫) + NoSQL的組合方案。
NoSQL的常見類型和比較
有四種常見的 NoSQL 數(shù)據(jù)庫類型:列式、文檔、圖形和內(nèi)存鍵值。
1.列式數(shù)據(jù)
顧名思義,是按列存儲數(shù)據(jù)的。***的特點是方便存儲結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,對針對某一列或者某幾列的查詢有非常大的IO優(yōu)勢。
1)對應(yīng)的nosql: HBase,BigTable等。
2)典型應(yīng)用場景:按列存儲,針對某一列或者某幾列的查詢有非常大的IO優(yōu)勢。
3)優(yōu)點:查找速度快,可擴(kuò)展性強,更容易進(jìn)行分布式擴(kuò)展。
4)缺點:功能相對局限。
2.文檔數(shù)據(jù)庫
旨在將半結(jié)構(gòu)化數(shù)據(jù)存儲為文檔,通常采用 JSON 或 XML 格式。與傳統(tǒng)關(guān)系數(shù)據(jù)庫不同的是,每個 NoSQL 文檔的架構(gòu)是不同的,可讓您更加靈活地整理和存儲應(yīng)用程序數(shù)據(jù)并減少可選值所需的存儲。
1)對應(yīng)的nosql:CouchDB, MongoDb
2)典型應(yīng)用場景:存儲類似JSON格式的內(nèi)容,可對某些字段建立索引功能,是最像關(guān)系型的數(shù)據(jù)庫。
3)優(yōu)點:數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格,表結(jié)構(gòu)可變,不需要像關(guān)系型數(shù)據(jù)庫一樣需要預(yù)先定義表結(jié)構(gòu)。
4)缺點:查詢性能不高,而且缺乏統(tǒng)一的查詢語法。
3.圖形數(shù)據(jù)庫
可存儲頂點以及稱為邊緣的直接鏈路。圖形數(shù)據(jù)庫可以在 SQL 和 NoSQL 數(shù)據(jù)庫上構(gòu)建。頂點和邊緣可以擁有各自的相關(guān)屬性。
1)數(shù)據(jù)模型:圖結(jié)構(gòu)
2)典型應(yīng)用場景:社交網(wǎng)絡(luò),推薦系統(tǒng)等。專注于構(gòu)建關(guān)系圖譜,善于處理大量復(fù)雜、互連接、低結(jié)構(gòu)化的數(shù)據(jù),數(shù)據(jù)往往變化迅速,且查詢頻繁。
3)優(yōu)點:利用圖結(jié)構(gòu)相關(guān)算法。比如最短路徑尋址,N度關(guān)系查找等。
4)缺點:很多時候需要對整個圖做計算才能得出需要的信息,而且這種結(jié)構(gòu)不太好做分布式的集群方案。
4.內(nèi)存鍵值存儲
可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收,是針對讀取密集型應(yīng)用程序工作負(fù)載(例如社交網(wǎng)絡(luò)、游戲、媒體共享和 Q&A 門戶)。內(nèi)存緩存可將重要數(shù)據(jù)存儲在內(nèi)存中以實現(xiàn)低延遲訪問,從而提高應(yīng)用程序性能。
1)對應(yīng)的nosql:Redis,Memcached等
2)典型應(yīng)用場景:內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問負(fù)載,也用于一些日志系統(tǒng)等等。
3)優(yōu)點:查找速度快。