列ストレージと行ストレージの詳細な理解


Dingdu!Xiao Ah Wooの学習コース資料をまとめたものです。良い記憶は悪いペンほど良いものではなく、今日も進歩の日です。一緒に進みましょう!
ここに画像の説明を挿入

1つの列ストレージと行ストレージ

列式存储是指一列中的数据在存储介质中是连续存储的;

行式存储是指一行中的数据在存储介质中是连续存储的。

簡単に言うと、各列がテーブルであるような列型データベースと考えることができます。このテーブルには列が1つしかありません。この列に対して条件付きクエリのみを実行すると、速度は非常に速くなります。

では、これら2つの異なる保存方法がデータのCRUDに与える影響は何でしょうか。

いくつかの記事を読んで、一般的に次の2つの点を話します。

1。行数据库适用于读取出少行,多列的情况;
   列数据库相反,适用于读取出少数列,多数行的情况。

2。列数据库可以节省空间,如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值。

第二に、列ストレージと行ストレージのより良い理解

従来、行式数据库完全なデータ行はデータページに格納されていました。このようにして、大量のデータをクエリするときに次の問題が発生します。

1、在没有索引的情况下,会把一行全部查出来,查询会使用大量IO
2、虽然建立索引和物化视图可以可以快速定位列,但是也需要花费大量时间

ただし、クエリを処理するためにほとんどのデータ列が必要な場合、この方法はディスクIOでより効率的です。
一般的に言えば、OLTP(Online Transaction Processing,联机事务处理)この方法はアプリケーションに適しています。

OLAPタイプのクエリは、数百万または数十億ものデータ行にアクセスする必要がある場合があり、クエリは通常、数個のデータ列のみを対象とします。たとえば、今年の売上が最も高い上位20製品をクエリする場合、このクエリは、時間(日付)、製品(アイテム)、および売上高(売上高)の3つのデータ列のみを対象とします。製品のURL、製品の説明、製品が属するストアなど、製品の他のデータ列は、このクエリでは意味がありません。

柱状データベースは、同じデータ列の値を一緒に格納します。データ行を挿入すると、行の各データ列の値も別の場所に格納されます。たとえば、上記の例では、列データベースは「時間、製品、売上高」を格納するデータ列を読み取るだけでよく、行データベースはすべてのデータ列を読み取る必要があります。したがって、列式数据库大大地提高了OLAP大数据量查询的效率もちろん、列型データベースは万能薬ではありません。データ行を読み取るたびに、さまざまな場所から各データ列の値を読み取り、それらを結合してデータ行を形成する必要がありますしたがって、如果每次查询涉及的数据量较小或者大部分查询都需要整行的数据,列式数据库并不适用

多くの列データベースは列组(column group,Bigtable系统中称为locality group)、一緒に頻繁にアクセスされる複数のデータ列の値を一緒に格納することもサポートしています。読み取ったデータ列が同じ列グループに属している場合、列データベースは、複数のデータ列の値を同じ場所から一度に読み取ることができるため、複数のデータ列のマージを回避できます列グループは、行と列の混合ストレージモードであり、OLTPとOLAPのクエリ要件を同時に満たすことができます。

同じデータ列でのデータの重複度が高いため、列データベースの圧縮には大きな利点があります。たとえば、Google Bigtableカラムナーデータベースは、Webページライブラリの圧縮で15倍を超える圧縮率を達成できますさらに、特別なインデックスの最適化を列ストレージに行うことができます。たとえば、性別列には「男性」と「女性」という2つの値しかありません。この列のビットマップインデックスを作成できます。
ここに画像の説明を挿入

上の図に示すように、「男性」に対応するビットマップは100101で、行1、4、6の値が「男性」であることを示します。「女性」に対応するビットマップは011010で、行2、3、5の値が「」であることを示します。女性"。如果需要查找男性或者女性的个数,只需要统计相应的位图中1出现的次数即可。さらに、ビットマップインデックスが確立された後は、0と1の繰り返しが多く、特別なエンコーディング方法を使用して圧縮できます。

3、カラム保管の利点

列モードに基づくストレージには、当然次の利点があります。

  1. 自動インデックス

列の格納に基づいているため、各列自体はインデックスと同等です。したがって、インデックスを必要とする操作を実行する場合、この列に適切なインデックスを作成するために追加のデータ構造は必要ありません。

  1. データ圧縮に役立つ

圧縮には2つの理由があります。

まず、列データのカーディナリティのほとんどが実際に繰り返されていることがわかります。たとえば、同じ作成者が複数のブログを公開するため、作成者列に表示されるすべての値のカーディナリティはブログの数よりも少ない必要があるため、作成者列のストレージ実際、ブログの数ほど大量のデータを保存する必要はありません。

第二に、同じ列のデータ型は一貫しており、これはデータ構造の充填の最適化と圧縮に有益であり、デジタル列のデータ型を圧縮して保存するために、より有利なアルゴリズムを採用できます。

4、まとめ

列式存储: 每一列单独存放,数据即是索引。
          只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅捷。
          一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。

行式存储: 把一行数据作为一个整体来存储。

いつ行ストレージを使用する必要がありますか?いつ列ストレージを使用する必要がありますか?

簡単に言えば:

ほとんどの場合、いくつかの列だけではなく、テーブル全体のコンテンツに焦点を当てており、対象のコンテンツに集計操作が必要ない場合は、それをお勧めし行式存储ます。

列式存储いくつかの列の内容、または頻繁な集計の必要性について懸念がある場合は、集計後のデータ分析にテーブルを使用してください。

円柱ストレージアプリケーションのシナリオ

基于一列或比较少的列计算的时候
经常关注一张表某几列而非整表数据的时候
数据表拥有非常多的列的时候
数据表有非常多行数据并且需要聚集运算的时候
数据表列里有非常多的重复数据,有利于高度压缩

行ストレージアプリケーションのシナリオ

关注整张表内容,或者需要经常更新数据
需要经常读取整行数据
不需要聚集运算,或者快速查询需求
数据表本身数据行并不多
数据表的列本身有太多唯一性的数据

エンディング!
より多くのコース知識学習記録は後で来ます!

就酱,嘎啦!

ここに画像の説明を挿入

注:
1.人生は勤勉であり、何も得られません。
2.列ストレージとは何ですか?理解するために数秒間記事を参照してください;
https://zhuanlan.zhihu.com/p/127823207

おすすめ

転載: blog.csdn.net/qq_43543789/article/details/108662140