1. 程式人生 > >NoSQL中的行儲存與列儲存

NoSQL中的行儲存與列儲存



在已知的幾種大資料處理軟體中,Hadoop的HBase採用列儲存,MongoDB是文件型的行儲存,Lexst是二進位制型的行儲存。在這裡,我不討論這些軟體的技術和優缺點,只圍繞機械磁碟的物理特質,分析行儲存和列儲存的儲存特點,以及由此產生的一些問題和解決辦法。

  一.結構佈局

  行儲存資料排列

  列儲存資料排列

  表格的灰色背景部分表示行列結構,白色背景部分表示資料的物理分佈,兩種儲存的資料都是從上至下,從左向右的排列。行是列的組合,行儲存以一行記錄為單位,列儲存以列資料集合單位,或稱列族(column family)。行儲存的讀寫過程是一致的,都是從第一列開始,到最後一列結束。列儲存的讀取是列資料集中的一段或者全部資料,寫入時,一行記錄

被拆分為多列,每一列資料追加到對應列的末尾處。

  二. 對比

  從上面表格可以看出,行儲存的寫入是一次完成。如果這種寫入建立在作業系統的檔案系統上,可以保證寫入過程的成功或者失敗,資料的完整性因此可以確定。列儲存由於需要把一行記錄拆分成單列儲存,寫入次數明顯比行儲存多,再加上磁頭需要在碟片上移動和定位花費的時間,實際時間消耗會更大。所以,行儲存在寫入上佔有很大的優勢。

  還有資料修改,這實際也是一次寫入過程。不同的是,資料修改是對磁碟上的記錄做刪除標記。行儲存是在指定位置寫入一次,列儲存是將磁碟定位到多個列上分別寫入,這個過程仍是行儲存的列數倍。所以,資料修改也是以行儲存佔優。 資料讀取時,行儲存通常將一行資料完全讀出,如果只需要其中幾列資料的情況,就會存在冗餘列,出於縮短處理時間的考量,消除冗餘列的過程通常是在記憶體中進行的。列儲存每次讀取的資料是集合的一段或者全部,如果讀取多列時,就需要移動磁頭,再次定位到下一列的位置繼續讀取。 再談兩種儲存的資料分佈。由於列儲存的每一列資料型別是同質的,不存在二義性問題。比如說某列資料型別為整型(int),那麼它的資料集合一定是整型資料。這種情況使資料解析變得十分容易。相比之下,行儲存則要複雜得多,因為在一行記錄中儲存了多種型別的資料,資料解析需要在多種資料型別之間頻繁轉換,這個操作很消耗CPU,增加了解析的時間。所以,列儲存的解析過程更有利於分析大資料。

  三. 優化

  顯而易見,兩種儲存格式都有各自的優缺點:行儲存的寫入是一次性完成,消耗的時間比列儲存少,並且能夠保證資料的完整性,缺點是資料讀取過程中會產生冗餘資料,如果只有少量資料,此影響可以忽略;數量大可能會影響到資料的處理效率。列儲存在寫入效率、保證資料完整性上都不如行儲存,它的優勢是在讀取過程,不會產生冗餘資料,這對資料完整性要求不高的大資料處理領域,比如網際網路,猶為重要。

  改進集中在兩方面:行儲存讀取過程中避免產生冗餘資料,列儲存提高讀寫效率。

  如何改進它們的缺點,並保證優點呢?

  行儲存的改進:減少冗餘資料首先是使用者在定義資料時避免冗餘列的產生;其次是優化資料儲存記錄結構,保證從磁碟讀出的資料進入記憶體後,能夠被快速

分解,消除冗餘列。要知道,目前市場上即使最低端CPU和記憶體的速度也比機械磁碟快上100-1000倍。如果用上高階的硬體配置,這個處理過程還要更快。

  列儲存的兩點改進:1.在計算機上安裝多塊硬碟,以多執行緒並行的方式讀寫它們。多塊硬碟並行工作可以減少磁碟讀寫競用,這種方式對提高處理效率優勢十分明顯。缺點是需要更多的硬碟,這會增加投入成本,在大規模資料處理應用中是不小的數目,運營商需要認真考慮這個問題。2.對寫過程中的資料完整性問題,可考慮在寫入過程中加入類似關係資料庫的“回滾”機制,當某一列發生寫入失敗時,此前寫入的資料全部失效,同時加入雜湊碼校驗,進一步保證資料完整性。

  這兩種儲存方案還有一個共同改進的地方:頻繁的小量的資料寫入對磁碟影響很大,更好的解決辦法是將資料在記憶體中暫時儲存並整理,達到一定數量後,一次性寫入磁碟,這樣消耗時間更少一些。目前機械磁碟的寫入速度在20M-50M/秒之間,能夠以批量的方式寫入磁碟,效果也是不錯的。

  四. 總結

  兩種儲存格式各自的特性都決定了它們不可能是完美的解決方案。 如果首要考慮是資料的完整性和可靠性,那麼行儲存是不二選擇,列儲存只有在增加磁碟並改進軟體設計後才能接近這樣的目標。如果以儲存資料為主,行儲存的寫入效能比列儲存高很多。在需要頻繁讀取單列集合資料的應用中,列儲存是最合適的。如果每次讀取多列,兩個方案可酌情選擇:採用行儲存時,設計中應考慮減少或避免冗餘列;若採用列儲存方案,為保證讀寫入效率,每列資料儘可能分別儲存到不同的磁碟上,多個執行緒並行讀寫各自的資料,這樣避免了磁碟競用的同時也提高了處理效率。 無論選擇哪種方案,將同內容資料聚湊在一起都是必須的,這是減少磁頭在磁碟上的移動,提高資料讀取時間的有效辦法。

原作者:袁萌

相關推薦

NoSQL中的行儲存儲存

 在已知的幾種大資料處理軟體中,Hadoop的HBase採用列儲存,MongoDB是文件型的行儲存,Lexst是二進位制型的行儲存。在這裡,我不討論這些軟體的技術和優缺點,只圍繞機械磁碟的物理特質,分析行儲存和列儲存的儲存特點,以及由此產生的一些問題和解決辦法。   一

儲存儲存

1 為什麼要按列儲存 列式儲存(Columnar or column-based)是相對於傳統關係型資料庫的行式儲存(Row-basedstorage)來說的。簡單來說兩者的區別就是如何組織表(翻譯不好,直接抄原文了): Ø  Row-based storage stores

儲存儲存的區別

寫入:行儲存的寫入是一次完成,資料的完整性因此可以確定。列儲存需要把一行記錄拆分成單列儲存,寫入次數明顯比行儲存多。行儲存在寫入上佔有很大的優勢資料修改:行儲存是在指定位置寫入一次,列儲存是將磁碟定位到多個列上分別寫入。行儲存在資料修改也是佔優的資料讀取:行儲存通常將一行資料

Apache Druid 底層儲存設計(儲存全文檢索)

> 導讀:首先你將通過這篇文章瞭解到 Apache Druid 底層的資料儲存方式。其次將知道為什麼 Apache Druid 兼具資料倉庫,全文檢索和時間序列的特點。最後將學習到一種優雅的底層資料檔案結構。 > 今日格言:優秀的軟體,從模仿開始的原創。 瞭解過 Apache Druid 或

儲存儲存

列儲存的資料庫更適合OLAP 行儲存的資料庫更適合OLTP 所謂的快只是針對於進行olap操作而言 我們知道,資料在儲存中的基本單位為頁,這也是進行資料讀取時候基本單位,一次讀取就是一次IO操作 以sql server為例,一個數據頁大小為8K,資料頁中儲存的是資料,資料是連續儲存的 那麼我假設如下的

大資料存取的選擇:行儲存還是儲存

上個月參加了一個雲端儲存的技術討論會。這一個月裡,陸續收到幾位同學討論大資料儲存和處理的郵件。今天是週末,索性把這個月的交流內容整理寫下來,供各位參考。   目前大資料儲存有兩種方案可供選擇:行儲存和列儲存。業界對兩種儲存方案有很多爭持,集中焦點是:誰能夠更有效地處理海量資

【大資料】大資料存取的選擇:行儲存還是儲存

轉自:http://storage.chinabyte.com/491/12390991.shtml 目前大資料儲存有兩種方案可供選擇:行儲存和列儲存。業界對兩種儲存方案有很多爭持,集中焦點是:誰能夠更有效地處理海量資料,且兼顧安全、可靠、完整性。從目前發展情況看,關

物件儲存儲存

什麼是塊儲存 資料被儲存在固定大小的塊內。塊內只儲存資料本身;Address就是塊唯一的識別資訊;對於塊儲存,沒有metadata. 當應用和資料都在本地的時候,效能會比較好;當應用和資料在地理位置上分離較遠的時候,效能會較差。 常見的企業級塊儲存由SAN提供。 適用場景: 塊儲

大資料儲存:行儲存還是儲存

目前大資料儲存有兩種方案可供選擇:行儲存和列儲存。業界對兩種儲存方案有很多爭持,集中焦點是:誰能夠更有效地處理海量資料,且兼顧安全、可靠、完整性。從目前發展情況看,關係資料庫已經不適應這種巨大的儲存量和計算要求,基本是淘汰出局。在已知的幾種大資料處理軟體中,Hadoop的

vue-x儲存本地儲存(localstorage、sessionstorage)

sessionstorage 也稱會話快取,當用戶關閉瀏覽器視窗後,資料就會被刪除; localstorage 儲存的資料沒有時間限制,只要不刪除,都會存在 vue-x 一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以

HANA資料庫的行儲存儲存

Column-Based andRow-Based Storage in the SAP HANA Database HANA資料庫同時支援行儲存和列儲存。列儲存讀效能好,擁有較高的壓縮比,一些特性如分割槽只適用於列儲存。常用於批量更新的大資料量表。行儲存更新插入效能好,

佇列的鏈式儲存順序儲存

佇列是一種先進先出的線性表,佇列也有兩種結構:順序儲存和鏈式儲存 一:佇列的鏈式儲存結構 為了實現鏈式儲存,就要設定結點資訊——元素和指向下一個結點的指標。為了實現佇列的先進先出(FIFO)的功能,就要有兩個指標指向開始和結尾,才能方便的進行插入和刪除。但是如何表示佇列

儲存 VS 儲存

概述目前大資料儲存有兩種方案可供選擇:行儲存(Row-Based)和列儲存(Column-Based)。業界對兩種儲存方案有很多爭持,集中焦點是:誰能夠更有效地處理海量資料,且兼顧安全、可靠、完整性。從目前發展情況看,關係資料庫已經不適應這種巨大的儲存量和計算要求,基本是淘汰

CloudStack那些事兒2 : 主儲存二級儲存

CloudStack的管理的儲存按用途分為主儲存(Primary Storage)和二級儲存(Secondary Storage),主儲存用來儲存虛擬機器的卷,二級儲存用來存放虛擬機器的模板,ISO映象和快照。值得一提的是,這裡的主儲存並不是指我們平時說的主存(

內部儲存外部儲存的區別

內部儲存: 內部儲存不是記憶體,而是一個位於系統中很特殊的一個位置。放入內部儲存中的資料一般都只能被你的應用訪問到,且一個應用所建立的所有檔案都在應用包名相同的目錄下,即/data/data/pack

徹底理解android中的內部儲存外部儲存

我們先來考慮這樣一個問題: 開啟手機設定,選擇應用管理,選擇任意一個App,然後你會看到兩個按鈕,一個是清除快取,另一個是清除資料,那麼當我們點選清除快取的時候清除的是哪裡的資料?當我們點選清除資料的時候又是清除的哪裡的資料?讀完本文相信你會有答案。 在android開發中

(轉載)儲存行式儲存

1 為什麼要按列儲存 列式儲存(Columnar or column-based)是相對於傳統關係型資料庫的行式儲存(Row-basedstorage)來說的。簡單來說兩者的區別就是如何組織表(翻譯不好,直接抄原文了): Ø  Row-based storage stor

高可靠性、高效能、可伸縮、分散式、基於儲存的非關係型(NoSQL)資料庫——Hbase

一、什麼是Hbase 二、Hbase分散式叢集搭建 Mysql和Hbase的區別: 三、HBase 表儲存結構 HBase 表邏輯檢視 表的形式儲存資料,表由行和列組成。列劃分為若干個列簇 (Column Family)。 2、HBase 表結構組成 行鍵(

傳統檔案系統NoSQL分散式儲存的塊儲存技術對比(1)

    本文第一部分介紹經典檔案系統ext3的塊儲存,第二部分介紹一個NoSQL分散式儲存系統的塊儲存。     ext系列檔案系統是linux的土著檔案系統,歷經4個版本,最新是ext4,在linux 2.6.28核心正式引入,目前比較新的linux發行版都已經把ext4

BigData NoSQL —— ApsaraDB HBase資料儲存分析平臺概覽

摘要: 資料庫發展有三個明顯的趨勢:1. 越來越多的資料庫會做雲原生(CloudNative);2. NoSQL正在解決