NoSQL與SQL資料庫對比分析

2023-02-02 18:00:05 字數 4799 閱讀 7423

目錄1. 背景 3

2. 傳統資料庫的缺點 3

3. nosql 解決方案 4

4. 總結 30

隨著大資料時代的到來,越來越多的**、應用系統需要支撐海量資料儲存,高併發、高可用、高可擴充套件性等特性要求。

傳統的關係型資料庫在應付這些已經顯得力不從心,並暴露了許多難以克服的問題。

由此,各種各樣的 nosql(not only sql)資料庫作為傳統關係型資料的乙個有力補充得到迅猛發展。

本文將分析傳統資料庫存在的一些問題,以及幾大類 nosql 如何解決這些問題,希望給大家提供一些在不同業務場景下儲存技術選型方面的參考。

傳統的資料庫有如下幾個缺點:

大資料場景下 i/o 較高,因為資料是按行儲存,即使只針對其中某一列進行運算,關係型資料庫也會將整行資料從儲存裝置中讀入記憶體,導致 i/o 較高。

儲存的是行記錄,無法儲存資料結構。

表結構 schema 擴充套件不方便,如要修改表結構,需要執行 ddl(data definition language),語句修改,修改期間會導致鎖表,部分服務不可用。

全文搜尋功能較弱,關係型資料庫下只能夠進行子字串的匹配查詢,當表的資料逐漸變大的時候,like 查詢的匹配會非常慢,即使在有索引的情況下。況且關係型資料庫也不應該對文字字段進行索引。

儲存和處理複雜關係型資料功能較弱,許多應用程式需要了解和導航高度連線資料之間的關係,才能啟用社交應用程式、推薦引擎、欺詐檢測、知識圖譜、生命科學和 it/網路等用例。

然而傳統的關聯式資料庫並不善於處理資料點之間的關係。它們的**資料模型和嚴格的模式使它們很難新增新的或不同種類的關聯資訊。

nosql,泛指非關係型的資料庫,可以理解為 sql 的乙個有力補充。

在 nosql 許多方面效能大大優於非關係型資料庫的同時,往往也伴隨一些特性的缺失,比較常見的是事務庫事務功能的缺失。

資料庫事務正確執行的四個基本要素acid 如下:

下面介紹 5 大類 nosql 資料針對傳統關係型資料庫的缺點和提供的解決方案:

列式資料庫

列式資料庫是以列相關儲存架構進行資料儲存的資料庫,主要適合於批量資料處理和即時查詢。

相對應的是行式資料庫,資料以行相關的儲存體系架構進行空間分配,主要適合於小批量的資料處理,常用於聯機事務型資料處理。

基於列式資料庫的列列儲存特性,可以解決某些特定場景下關係型資料庫 i/o 較高的問題。

基本原理

傳統關係型資料庫是按照行來儲存資料庫,稱為「行式資料庫」,而列式資料庫是按照列來儲存資料。

將表放入儲存系統中有兩種方法,而我們絕大部分是採用行儲存的。行儲存法是將各行放入連續的物理位置,這很像傳統的記錄和檔案系統。

列儲存法是將資料按照列儲存到資料庫中,與行儲存類似。下圖是兩種儲存方法的圖形化解釋:

常見列式資料庫

hbase:是乙個開源的非關係型分布式資料庫(nosql),它參考了谷歌的 bigtable 建模,實現的程式語言為 j**a。

它是 apache 軟體**會的 hadoop 專案的一部分,執行於 hdfs 檔案系統之上,為 hadoop 提供類似於 bigtable 規模的服務。因此,它可以容錯地儲存海量稀疏的資料。

bigtable:是一種壓縮的、高效能的、高可擴充套件性的,基於 google 檔案系統(google file system,gfs)的資料儲存系統,用於儲存大規模結構化資料,適用於雲計算。

相關特性

優點如下:

高效的儲存空間利用率:列式資料庫由於其針對不同列的資料特徵而發明的不同演算法使其往往有比行式資料庫高的多的壓縮率。

普通的行式資料庫一般壓縮率在 3:1 到 5:1 左右,而列式資料庫的壓縮率一般在 8:1 到 30:1 左右。

比較常見的,通過字典表壓縮資料: 下面中才是那張表本來的樣子。經過字典表進行資料壓縮後,表中的字串才都變成數字了。

正因為每個字串在字典表裡只出現一次了,所以達到了壓縮的目的(有點像規範化和非規範化 normalize 和 denomalize)。

查詢效率高:讀取多條資料的同一列效率高,因為這些列都是儲存在一起的,一次磁碟操作可以把資料的指定列全部讀取到記憶體中。

下圖通過一條查詢的執行過程說明列式儲存(以及資料壓縮)的優點。

執行步驟如下:

去字典表裡找到字串對應數字(只進行一次字串比較)。

用數字去列表裡匹配,匹配上的位置設為 1。

把不同列的匹配結果進行位運算得到符合所有條件的記錄下標。

使用這個下標組裝出最終的結果集。

列式資料庫還適合做聚合操作,適合大量的資料而不是小資料。

缺點如下:

不適合掃瞄小量資料。

不適合隨機的更新。

不適合做含有刪除和更新的實時操作。

單行的資料是 acid 的,多行的事務時,不支援事務的正常回滾,支援 i(isolation)隔離性(事務序列提交),d(durability)永續性,不能保證 a(atomicity)原子性, c(consistency)一致性。

使用場景

以 hbase 為例說明:

大資料量(100s tb級資料),且有快速隨機訪問的需求。

寫密集型應用,每天寫入量巨大,而相對讀數量較小的應用,比如 im 的歷史訊息,遊戲的日誌等等。

不需要複雜查詢條件來查詢資料的應用,hbase 只支援基於 rowkey 的查詢,對於 hbase 來說,單條記錄或者小範圍的查詢是可以接受的。

大範圍的查詢由於分布式的原因,可能在效能上有點影響,hbase 不適用於有 join,多級索引,表關係複雜的資料模型。

對效能和可靠性要求非常高的應用,由於 hbase 本身沒有單點故障,可用性非常高。

資料量較大,而且增長量無法預估的應用,需要進行優雅的資料擴充套件的 hbase 支援**擴充套件,即使在一段時間內資料量呈井噴式增長,也可以通過 hbase 橫向擴充套件來滿足功能。

儲存結構化和半結構化的資料。

k-v 資料庫

指的是使用鍵值(key-value)儲存的資料庫,其資料按照鍵值對的形式進行組織、索引和儲存。

k-v 儲存非常適合不涉及過多資料關係業務關係的資料,同時能有效減少讀寫磁碟的次數,比 sql 資料庫儲存擁有更好的讀寫效能,能夠解決關係型資料庫無法儲存資料結構的問題。

常見 k-v 資料庫

redis:是乙個使用 ansi c 編寫的開源、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫。

從 2015 年 6 月開始,redis 的開發由 redis labs 贊助,而 2013 年 5 月至 2015 年 6 月期間,其開發由 pivotal 贊助。

在 2013 年 5 月之前,其開發由 vmware 贊助。根據月度排行** 的資料顯示,redis 是最流行的鍵值對儲存資料庫。

cassandra:apache cassandra(社群內一般簡稱為c*)是一套開源分布式 nosql 資料庫系統。

它最初由 facebook 開發,用於儲存收件箱等簡單格式資料,集 google bigtable 的資料模型與 amazon dynamo 的完全分布式架構於一身。

facebook 於 2008 將 cassandra 開源,此後,由於 cassandra 良好的可擴充套件性和效能。

它被 apple,comcas,instagram,spotify,ebay,rackspace,netflix 等知名**所採用,成為了一種流行的分布式結構化資料儲存方案。

leveldb:是乙個由 google 公司所研發的鍵/值對(key/value pair)嵌入式資料庫管理系統程式設計庫, 以開源的 bsd 許可證發布。

相關特性

以 redis 為例,k-v 資料庫優點如下:

效能極高:redis 能支援超過 10w 的 tps。

豐富的資料型別:redis 支援包括 string,hash,list,set,sorted set,bitmap 和 hyperloglog。

豐富的特性:redis 還支援 publish/subscribe,通知,key 過期等等特性。

缺點如下:

針對 acid,redis 事務不能支援原子性和永續性(a 和 d),只支援隔離性和一致性(i 和 c) 。

特別說明一下,這裡所說的無法保證原子性,是針對 redis 的事務操作,因為事務是不支援回滾(roll back),而因為 redis 的單執行緒模型,redis 的普通操作是原子性的。

大部分業務不需要嚴格遵循 acid 原則,例如遊戲實時排行榜,粉絲關注等場景,即使部分資料持久化失敗,其實業務影響也非常小。因此在設計方案時,需要根據業務特徵和要求來做選擇。

使用場景

適用場景:

儲存使用者資訊(比如會話)、配置檔案、引數、購物車等等。這些資訊一般都和 id(鍵)掛鉤。

不適用場景:

需要通過值來查詢,而不是鍵來查詢。key-value 資料庫中根本沒有通過值查詢的途徑。

需要儲存資料之間的關係。在 key-value 資料庫中不能通過兩個或以上的鍵來關聯資料。

需要事務的支援。在 key-value 資料庫中故障產生時不可以進行回滾。

文件資料庫

文件資料庫(也稱為文件型資料庫)是旨在將半結構化資料儲存為文件的一種資料庫。文件資料庫通常以 json 或 xml 格式儲存資料。

由於文件資料庫的 no-schema 特性,可以儲存和讀取任意資料。

由於使用的資料格式是 json 或者 bson,因為 json 資料是自描述的,無需在使用前定義字段,讀取乙個 json 中不存在的字段也不會導致 sql 那樣的語法錯誤,可以解決關係型資料庫表結構 schema 擴充套件不方便的問題。

常見文件資料庫

mongodb:是一種面向文件的資料庫管理系統,由 c++ 撰寫而成,以此來解決應用程式開發社群中的大量現實問題。2007 年 10 月,mongodb 由 10gen 團隊所發展。

2009 年 2 月首度推出。

資料庫SQL練習

建立學生student表 sno學號 主鍵3 sname姓名8 s 性別2 sbirthday生日 class班級5 建立課程course表 cno 課程號 主鍵 5 cname課程名10 tno教師號3 建立分數score表 sno 學號3 cno課程號5 degree分數 建立老師teacher...

主流NoSQL資料庫評測之HBase

本篇要評測的nosql產品是hbase,和其他簡單的key value結構不同,hbase主要面向處理海量資料的應用,可以認為是google bigtable的乙個開源版本。由於facebook使用hbase來儲存訊息內容和大資料量的實時分析而使得這一產品備受關注。一 hbase簡介 hbase是用...

Sql資料庫命名規則

資料庫涉及字元規則 採用26個英文本母 區分大小寫 和0 9這十個自然數,加上下劃線 組成,共63個字元。不能出現其他字元 注釋除外 資料庫物件命名規則 資料庫物件包括表 檢視 查詢 儲存過程 引數查詢 函式 約束。物件名字由字首和實際名字組成,長度不超過30。字首 使用小寫字母。例如 實際名字 實...