精华内容
下载资源
问答
  • 字段是列的交集:某种类型的单个值。属于同一字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将相同的类型,并且属于同一。在逻辑上属于同一数据记录(通常...
    bee84ef57bcdcad451761ac58818e168.gif

    导读:本文带你了解面向列与面向行的数据库。

    作者:Alex Petrov来源:大数据DT(ID:hzdashuju)5281958941827c5ad0688606af2d19ad.png大多数数据库系统存储一组数据记录,这些记录由中的组成。字段是列和行的交集:某种类型的单个值。属于同一列的字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将是相同的类型,并且属于同一列。在逻辑上属于同一数据记录(通常由键标识)的值的集合构成一行。对数据库进行分类的方法之一是按数据在磁盘上的存储方式进行分类:按行或按列进行分类。表可以水平分区(将属于同一行的值存储在一起),也可以垂直分区(将属于同一列的值存储在一起)。图1-2描述了这种区别:a)显示了按列分区的值,b)显示了按行分区的值。5591280f26d36fda5218251a71e89ad0.png▲图1-2:面向列和行的存储中的数据布局面向行的数据库的例子很多:MySQL、PostgreSQL大多数传统的关系数据库。而两个开源的、面向列数据存储的先驱则是MonetDBC-Store(C-Store是Vertica的开源前身)。01 面向行的数据布局面向行的数据库按记录或来存储数据。它的布局非常接近表格的数据表示方法,即其中每一行都具有相同的字段集合。例如,面向行的数据库可以有效地存储用户条目,其中包含姓名、出生日期和电话号码:| ID | Name  | Birth Date  | Phone Number   || 10 | John  | 01 Aug 1981 | +1 111 222 333 || 20 | Sam   | 14 Sep 1988 | +1 555 888 999 || 30 | Keith | 07 Jan 1984 | +1 333 444 555 |这种方法适用于如下的场景:数据记录(姓名、出生日期和电话号码)由多个字段组成且由某个键(在本例中为单调递增的ID)所唯一标识。表示单个用户的数据记录的所有字段通常被一起读取。在创建数据时(例如,当用户填写注册表单时),我们也将它们一起写入数据库。与此同时,我们可以单独修改某个字段。在需要按行访问数据的情况下,面向行的存储最有用,将整行存储在一起可以提高空间局部性。因为诸如磁盘之类的持久性介质上的数据通常是按块访问的(换句话说,磁盘访问的最小单位是块),所以单个块可能将包含某行中所有列的数据。这对于我们希望访问整个用户记录的情况非常有用,但这样的存储布局会使访问多个用户记录某个字段的查询(例如,只获取电话号码的查询)开销更大,因为其他字段的数据在这个过程中也会被读入。87c0d4d221c1c63fe170a9c527ae3559.png02 面向列的数据布局面向列的数据库垂直地将数据进行分区(即通过列进行分区),而不是将其按行存储。在这种数据存储布局中,同一列的值被连续地存储在磁盘上(而不是像前面的示例那样将行连续地存储)。例如,如果我们要存储股票市场的历史价格,那么股票价格这一列的数据便会被存储在一起。将不同列的值存储在不同的文件或文件段中,可以按列进行有效的查询,因为它们可以一次性地被读取出来,而不是先对整行进行读取后再丢弃掉不需要的列。面向列的存储非常适合计算聚合的分析型工作负载,例如查找趋势、计算平均值等。如果逻辑记录具有多个字段,但是其中某些字段(在本例中为股票价格)具有不同的重要性并且该字段所存储的数据经常被一起使用,那么我们一般使用复杂聚合来处理这样的情况。从逻辑角度看,表示股票市场价格的数据仍旧可以表示为表的形式:| ID | Symbol | Date        | Price     || 1  | DOW    | 08 Aug 2018 | 24,314.65 || 2  | DOW    | 09 Aug 2018 | 24,136.16 || 3  | S&P    | 08 Aug 2018 | 2,414.45  || 4  | S&P    | 09 Aug 2018 | 2,232.32  |而列式存储则看起来与上述存储布局完全不同—属于同一列的值被紧密地存储在一起:Symbol: 1:DOW; 2:DOW; 3:S&P; 4:S&PDate:   1:08 Aug 2018; 2:09 Aug 2018; 3:08 Aug 2018; 4:09 Aug 2018Price:  1:24,314.65; 2:24,136.16; 3:2,414.45; 4:2,232.32为了重建数据元组(这对于连接、筛选和多行聚合可能很有用),我们需要在列级别上保留一些元数据,以标识与它关联的其他列中的数据点是哪些。如果你显式地执行此操作,则需要每个值都必须持有一个键,这将导致数据重复并增加存储的数据量。针对这种需求,一些列存储使用隐式标识符(虚拟ID),并使用该值的位置(换句话说,其偏移量)将其映射回相关值。在过去几年中,可能由于对不断增长的数据集运行复杂分析查询的需求不断增长,我们看到了许多新的面向列的文件格式,如Apache Parquet、Apache ORC、RCFile,以及面向列的存储,如Apache Kudu、ClickHouse,以及许多其他列式数据存储组件。c46e7ff04eb7ab5dc5ea570d7989534f.png03 区别与优化认为行存储和列存储之间的区别仅在于数据的存储方式有所不同,这是不充分的。选择数据布局只是列式存储所针对的一系列可能的优化的步骤之一。在一次读取中,从同一列中读取多个值可以显著提高缓存利用率和计算效率。在现代CPU上,向量化指令可以使单条CPU指令一次处理多个数据点。另外,将具有相同数据类型的值存储在一起(例如,数字与数字在一起,字符串与字符串在一起)可以提高压缩率。我们可以根据不同的数据类型使用不同的压缩算法,并为每种情况选择最有效的压缩方法。要决定是使用面向列还是面向行的存储,你需要了解访问模式。如果所读取的记录中的大多数或所有列都是需要的,并且工作负载主要由单条记录查询和范围扫描组成,则面向行的存储布局可能产生更好的结果。如果扫描跨越多行,或者在列的子集上进行计算聚合,则值得考虑使用面向列的存储布局。04 宽列式存储面向列的数据库不应与宽列式存储(如BigTable或HBase)相混淆。在这些数据库中,数据表示为多维映射,列被分组为列族(通常存储相同类型的数据),并且在每个列族中,数据被逐行存储。此布局最适合存储由一个键或一组键来检索的数据。BigTable论文中的一个典型示例是WebTable。一个WebTable存储着一个带有某个时间戳、包含如下信息的快照:网页内容、属性以及它们之间的关系。页面由反向URL所标识,并且所有属性(如页面内容和锚,锚表示页面之间的链接)由生成这些快照的时间戳来标识。简而言之,它可以表示为一个嵌套的映射,如图1-3所示。637f103adb188c6266886546252bda8b.png▲图1-3:WebTable的概念性结构数据存储在具有层次索引的多维排序映射中:我们可以通过特定网页的反向URL来定位与该网页相关的数据,也可以通过时间戳来定位该网页的内容或锚。每一行都按其行键进行索引。在列族中,相关列被分组在一起(在本例中为contents和anchor),这些列族分别存储在磁盘上。列族中的每个列都由列键标识,该键是列族名称和限定符(在本例中为html,cnnsi.com,my.look.ca)的组合。列族可以按照时间戳存储多个版本的数据。这种布局使得我们可以快速定位更高层的条目(在本例中为Web页面)及其参数(不同版本的内容和指向其他页面的链接)。理解宽列式存储的概念表示是有用的,而它们的物理布局也有所不同。列族的数据布局示意图如图1-4所示:列族被单独存储,但在每个列族中,属于同一键的数据被存储在一起。a9ef93d5043b2f6ca6ea0aee1c2a1dca.png▲图1-4:WebTable的物理结构关于作者:Alex Petrov是一位数据基础架构工程师,数据库和存储系统的狂热爱好者,Apache Cassandra 提交者和PMC成员,精通存储、分布式系统和算法。本文摘编自数据库系统内幕》,经出版方授权发布。延伸阅读数据库系统内幕点击上图了解及购买转载请联系微信:DoctorData推荐语:本书旨在指导开发者理解现代数据库和存储引擎背后的内部概念,包含从众多书籍、论文、博客和多个开源数据库源代码中精心选取的相关材料。本书深入介绍了数据存储、数据构建块、分布式系统和数据集群,并且指出了现代数据库之间最重要的区别在于决定存储结构和数据分布的子系统。12e8e8e22e7aad5faf2db9c677ad0270.gif划重点?干货直达?
    • 6个维度、1个书单,解读最近很火的数据产品经理是做什么的

    • 数据库有哪些分类?应该怎样选择?终于有人讲明白了

    • 只能存储12KB数据,“码农女神”是怎样把人类送上月球的?

    • 盘点人工智能十大经典应用领域、图解技术原理

    更多精彩?在公众号对话框输入以下关键词查看更多优质内容!PPT | 读书 | 书单 | 硬核 | 干货 | 讲明白大数据 | 云计算 | 数据库 | Python | 可视化 | 神操作AI | 人工智能 | 机器学习 | 深度学习 | 神经网络5G | 中台 | 用户画像 1024 | 大神 | 数学 | 揭秘据统计,99%的大咖都完成了这个神操作?

    191c368b9266ecc6265af5124c178aeb.gif

    639f2fb809c2a6fea4cbf32ce251a8eb.png
    展开全文
  • 字段是列的交集:某种类型的单个值。属于同一字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将相同的类型,并且属于同一。在逻辑上属于同一数据记录(通常...

    f42af6c1d9ecaf8c6a36c8b20457a213.png

    导读:本文带你了解面向列与面向行的数据库。

    作者:Alex Petrov来源:大数据DT(ID:hzdashuju)大多数数据库系统存储一组数据记录,这些记录由中的组成。字段是列和行的交集:某种类型的单个值。属于同一列的字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将是相同的类型,并且属于同一列。在逻辑上属于同一数据记录(通常由键标识)的值的集合构成一行。对数据库进行分类的方法之一是按数据在磁盘上的存储方式进行分类:按行或按列进行分类。表可以水平分区(将属于同一行的值存储在一起),也可以垂直分区(将属于同一列的值存储在一起)。图1-2描述了这种区别:a)显示了按列分区的值,b)显示了按行分区的值。460d089dff1e69a98bac61335828fa68.png▲图1-2:面向列和行的存储中的数据布局面向行的数据库的例子很多:MySQL、PostgreSQL大多数传统的关系数据库。而两个开源的、面向列数据存储的先驱则是MonetDBC-Store(C-Store是Vertica的开源前身)。01 面向行的数据布局面向行的数据库按记录或来存储数据。它的布局非常接近表格的数据表示方法,即其中每一行都具有相同的字段集合。例如,面向行的数据库可以有效地存储用户条目,其中包含姓名、出生日期和电话号码:| ID | Name  | Birth Date  | Phone Number   || 10 | John  | 01 Aug 1981 | +1 111 222 333 || 20 | Sam   | 14 Sep 1988 | +1 555 888 999 || 30 | Keith | 07 Jan 1984 | +1 333 444 555 |这种方法适用于如下的场景:数据记录(姓名、出生日期和电话号码)由多个字段组成且由某个键(在本例中为单调递增的ID)所唯一标识。表示单个用户的数据记录的所有字段通常被一起读取。在创建数据时(例如,当用户填写注册表单时),我们也将它们一起写入数据库。与此同时,我们可以单独修改某个字段。在需要按行访问数据的情况下,面向行的存储最有用,将整行存储在一起可以提高空间局部性。因为诸如磁盘之类的持久性介质上的数据通常是按块访问的(换句话说,磁盘访问的最小单位是块),所以单个块可能将包含某行中所有列的数据。这对于我们希望访问整个用户记录的情况非常有用,但这样的存储布局会使访问多个用户记录某个字段的查询(例如,只获取电话号码的查询)开销更大,因为其他字段的数据在这个过程中也会被读入。f26554d4268d47e889f1236d3033fb5f.png02 面向列的数据布局面向列的数据库垂直地将数据进行分区(即通过列进行分区),而不是将其按行存储。在这种数据存储布局中,同一列的值被连续地存储在磁盘上(而不是像前面的示例那样将行连续地存储)。例如,如果我们要存储股票市场的历史价格,那么股票价格这一列的数据便会被存储在一起。将不同列的值存储在不同的文件或文件段中,可以按列进行有效的查询,因为它们可以一次性地被读取出来,而不是先对整行进行读取后再丢弃掉不需要的列。面向列的存储非常适合计算聚合的分析型工作负载,例如查找趋势、计算平均值等。如果逻辑记录具有多个字段,但是其中某些字段(在本例中为股票价格)具有不同的重要性并且该字段所存储的数据经常被一起使用,那么我们一般使用复杂聚合来处理这样的情况。从逻辑角度看,表示股票市场价格的数据仍旧可以表示为表的形式:| ID | Symbol | Date        | Price     || 1  | DOW    | 08 Aug 2018 | 24,314.65 || 2  | DOW    | 09 Aug 2018 | 24,136.16 || 3  | S&P    | 08 Aug 2018 | 2,414.45  || 4  | S&P    | 09 Aug 2018 | 2,232.32  |而列式存储则看起来与上述存储布局完全不同—属于同一列的值被紧密地存储在一起:Symbol: 1:DOW; 2:DOW; 3:S&P; 4:S&PDate:   1:08 Aug 2018; 2:09 Aug 2018; 3:08 Aug 2018; 4:09 Aug 2018Price:  1:24,314.65; 2:24,136.16; 3:2,414.45; 4:2,232.32为了重建数据元组(这对于连接、筛选和多行聚合可能很有用),我们需要在列级别上保留一些元数据,以标识与它关联的其他列中的数据点是哪些。如果你显式地执行此操作,则需要每个值都必须持有一个键,这将导致数据重复并增加存储的数据量。针对这种需求,一些列存储使用隐式标识符(虚拟ID),并使用该值的位置(换句话说,其偏移量)将其映射回相关值。在过去几年中,可能由于对不断增长的数据集运行复杂分析查询的需求不断增长,我们看到了许多新的面向列的文件格式,如Apache Parquet、Apache ORC、RCFile,以及面向列的存储,如Apache Kudu、ClickHouse,以及许多其他列式数据存储组件。0221acb2f31d8b5217682f4899d6fef5.png03 区别与优化认为行存储和列存储之间的区别仅在于数据的存储方式有所不同,这是不充分的。选择数据布局只是列式存储所针对的一系列可能的优化的步骤之一。在一次读取中,从同一列中读取多个值可以显著提高缓存利用率和计算效率。在现代CPU上,向量化指令可以使单条CPU指令一次处理多个数据点。另外,将具有相同数据类型的值存储在一起(例如,数字与数字在一起,字符串与字符串在一起)可以提高压缩率。我们可以根据不同的数据类型使用不同的压缩算法,并为每种情况选择最有效的压缩方法。要决定是使用面向列还是面向行的存储,你需要了解访问模式。如果所读取的记录中的大多数或所有列都是需要的,并且工作负载主要由单条记录查询和范围扫描组成,则面向行的存储布局可能产生更好的结果。如果扫描跨越多行,或者在列的子集上进行计算聚合,则值得考虑使用面向列的存储布局。04 宽列式存储面向列的数据库不应与宽列式存储(如BigTable或HBase)相混淆。在这些数据库中,数据表示为多维映射,列被分组为列族(通常存储相同类型的数据),并且在每个列族中,数据被逐行存储。此布局最适合存储由一个键或一组键来检索的数据。BigTable论文中的一个典型示例是WebTable。一个WebTable存储着一个带有某个时间戳、包含如下信息的快照:网页内容、属性以及它们之间的关系。页面由反向URL所标识,并且所有属性(如页面内容和锚,锚表示页面之间的链接)由生成这些快照的时间戳来标识。简而言之,它可以表示为一个嵌套的映射,如图1-3所示。36c77a8cf25bfeba25f4d96e08025757.png▲图1-3:WebTable的概念性结构数据存储在具有层次索引的多维排序映射中:我们可以通过特定网页的反向URL来定位与该网页相关的数据,也可以通过时间戳来定位该网页的内容或锚。每一行都按其行键进行索引。在列族中,相关列被分组在一起(在本例中为contents和anchor),这些列族分别存储在磁盘上。列族中的每个列都由列键标识,该键是列族名称和限定符(在本例中为html,cnnsi.com,my.look.ca)的组合。列族可以按照时间戳存储多个版本的数据。这种布局使得我们可以快速定位更高层的条目(在本例中为Web页面)及其参数(不同版本的内容和指向其他页面的链接)。理解宽列式存储的概念表示是有用的,而它们的物理布局也有所不同。列族的数据布局示意图如图1-4所示:列族被单独存储,但在每个列族中,属于同一键的数据被存储在一起。58e651fb0fc03eb9df50cea04caef774.png▲图1-4:WebTable的物理结构关于作者:Alex Petrov是一位数据基础架构工程师,数据库和存储系统的狂热爱好者,Apache Cassandra 提交者和PMC成员,精通存储、分布式系统和算法。本文摘编自数据库系统内幕》,经出版方授权发布。8da45c68754f5d9f623b3b01aae72a50.gif

    ?推荐阅读 READ MORE

    (点击下方图片阅读)

    c8d07111dd349a8e098fb0c8bfef89b0.png

    一小时销量破百万,Python告诉你周杰伦的《Mojito》到底有多火!

    75c8182c0e237f7c3beb61089becfe3f.png

    电竞天才Uzi宣布退役!用数据带你回顾他的职业生涯

     8da45c68754f5d9f623b3b01aae72a50.gif

    ?CDA课程咨询

    65b4652f06c618ab08b5bdfea0c74ff3.png

    喜欢本篇内容请点个“在看”哦!❤️

    展开全文
  • 字段是列的交集:某种类型的单个值。属于同一字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将相同的类型,并且属于同一。在逻辑上属于同一数据记录(通常...

    大多数数据库系统存储一组数据记录,这些记录由表中的列和行组成。字段是列和行的交集:某种类型的单个值。

    属于同一列的字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将是相同的类型,并且属于同一列。在逻辑上属于同一数据记录(通常由键标识)的值的集合构成一行。

    对数据库进行分类的方法之一是按数据在磁盘上的存储方式进行分类:按行或按列进行分类。表可以水平分区(将属于同一行的值存储在一起),也可以垂直分区(将属于同一列的值存储在一起)。图1-2描述了这种区别:a)显示了按列分区的值,b)显示了按行分区的值。▲图1-2:面向列和行的存储中的数据布局

    面向行的数据库的例子很多:MySQL、PostgreSQL和大多数传统的关系数据库。而两个开源的、面向列数据存储的先驱则是MonetDB和C-Store(C-Store是Vertica的开源前身)。

    01 面向行的数据布局

    面向行的数据库按记录或行来存储数据。它的布局非常接近表格的数据表示方法,即其中每一行都具有相同的字段集合。例如,面向行的数据库可以有效地存储用户条目,其中包含姓名、出生日期和电话号码:

    | ID | Name | Birth Date | Phone Number || 10 | John | 01 Aug 1981 | +1 111 222 333 || 20 | Sam | 14 Sep 1988 | +1 555 888 999 || 30 | Keith | 07 Jan 1984 | +1 333 444 555 |

    这种方法适用于如下的场景:数据记录(姓名、出生日期和电话号码)由多个字段组成且由某个键(在本例中为单调递增的ID)所唯一标识。表示单个用户的数据记录的所有字段通常被一起读取。在创建数据时(例如,当用户填写注册表单时),我们也将它们一起写入数据库。与此同时,我们可以单独修改某个字段。

    在需要按行访问数据的情况下,面向行的存储最有用,将整行存储在一起可以提高空间局部性。

    因为诸如磁盘之类的持久性介质上的数据通常是按块访问的(换句话说,磁盘访问的最小单位是块),所以单个块可能将包含某行中所有列的数据。

    这对于我们希望访问整个用户记录的情况非常有用,但这样的存储布局会使访问多个用户记录某个字段的查询(例如,只获取电话号码的查询)开销更大,因为其他字段的数据在这个过程中也会被读入。

    02 面向列的数据布局

    面向列的数据库垂直地将数据进行分区(即通过列进行分区),而不是将其按行存储。在这种数据存储布局中,同一列的值被连续地存储在磁盘上(而不是像前面的示例那样将行连续地存储)。

    例如,如果我们要存储股票市场的历史价格,那么股票价格这一列的数据便会被存储在一起。将不同列的值存储在不同的文件或文件段中,可以按列进行有效的查询,因为它们可以一次性地被读取出来,而不是先对整行进行读取后再丢弃掉不需要的列。

    面向列的存储非常适合计算聚合的分析型工作负载,例如查找趋势、计算平均值等。如果逻辑记录具有多个字段,但是其中某些字段(在本例中为股票价格)具有不同的重要性并且该字段所存储的数据经常被一起使用,那么我们一般使用复杂聚合来处理这样的情况。

    从逻辑角度看,表示股票市场价格的数据仍旧可以表示为表的形式:

    | ID | Symbol | Date | Price || 1 | DOW | 08 Aug 2018 | 24,314.65 || 2 | DOW | 09 Aug 2018 | 24,136.16 || 3 | S&P | 08 Aug 2018 | 2,414.45 || 4 | S&P | 09 Aug 2018 | 2,232.32 |

    而列式存储则看起来与上述存储布局完全不同—属于同一列的值被紧密地存储在一起:

    Symbol: 1:DOW; 2:DOW; 3:S&P; 4:S&PDate: 1:08 Aug 2018; 2:09 Aug 2018; 3:08 Aug 2018; 4:09 Aug 2018Price: 1:24,314.65; 2:24,136.16; 3:2,414.45; 4:2,232.32

    为了重建数据元组(这对于连接、筛选和多行聚合可能很有用),我们需要在列级别上保留一些元数据,以标识与它关联的其他列中的数据点是哪些。如果你显式地执行此操作,则需要每个值都必须持有一个键,这将导致数据重复并增加存储的数据量。

    针对这种需求,一些列存储使用隐式标识符(虚拟ID),并使用该值的位置(换句话说,其偏移量)将其映射回相关值。

    在过去几年中,可能由于对不断增长的数据集运行复杂分析查询的需求不断增长,我们看到了许多新的面向列的文件格式,如Apache Parquet、Apache ORC、RCFile,以及面向列的存储,如Apache Kudu、ClickHouse,以及许多其他列式数据存储组件。

    03 区别与优化

    认为行存储和列存储之间的区别仅在于数据的存储方式有所不同,这是不充分的。选择数据布局只是列式存储所针对的一系列可能的优化的步骤之一。

    在一次读取中,从同一列中读取多个值可以显著提高缓存利用率和计算效率。在现代CPU上,向量化指令可以使单条CPU指令一次处理多个数据点。

    另外,将具有相同数据类型的值存储在一起(例如,数字与数字在一起,字符串与字符串在一起)可以提高压缩率。我们可以根据不同的数据类型使用不同的压缩算法,并为每种情况选择最有效的压缩方法。

    要决定是使用面向列还是面向行的存储,你需要了解访问模式。如果所读取的记录中的大多数或所有列都是需要的,并且工作负载主要由单条记录查询和范围扫描组成,则面向行的存储布局可能产生更好的结果。如果扫描跨越多行,或者在列的子集上进行计算聚合,则值得考虑使用面向列的存储布局。

    04 宽列式存储

    面向列的数据库不应与宽列式存储(如BigTable或HBase)相混淆。在这些数据库中,数据表示为多维映射,列被分组为列族(通常存储相同类型的数据),并且在每个列族中,数据被逐行存储。此布局最适合存储由一个键或一组键来检索的数据。

    BigTable论文中的一个典型示例是WebTable。一个WebTable存储着一个带有某个时间戳、包含如下信息的快照:网页内容、属性以及它们之间的关系。

    页面由反向URL所标识,并且所有属性(如页面内容和锚,锚表示页面之间的链接)由生成这些快照的时间戳来标识。简而言之,它可以表示为一个嵌套的映射,如图1-3所示。▲图1-3:WebTable的概念性结构

    数据存储在具有层次索引的多维排序映射中:我们可以通过特定网页的反向URL来定位与该网页相关的数据,也可以通过时间戳来定位该网页的内容或锚。每一行都按其行键进行索引。

    在列族中,相关列被分组在一起(在本例中为contents和anchor),这些列族分别存储在磁盘上。列族中的每个列都由列键标识,该键是列族名称和限定符(在本例中为html,http://cnnsi.com,http://my.look.ca)的组合。

    列族可以按照时间戳存储多个版本的数据。这种布局使得我们可以快速定位更高层的条目(在本例中为Web页面)及其参数(不同版本的内容和指向其他页面的链接)。

    理解宽列式存储的概念表示是有用的,而它们的物理布局也有所不同。列族的数据布局示意图如图1-4所示:列族被单独存储,但在每个列族中,属于同一键的数据被存储在一起。▲图1-4:WebTable的物理结构

    [声明]本文版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,如涉及作品内容、版权等问题,可联系本站删除,谢谢。

    展开全文
  • 字段是列的交集:某种类型的单个值。属于同一字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将相同的类型,并且属于同一。在逻辑上属于同一数据记录(通常...

    4c503218f245f5c79392d39bffc65f05.png

    大多数数据库系统存储一组数据记录,这些记录由中的组成。字段是列和行的交集:某种类型的单个值。

    属于同一列的字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将是相同的类型,并且属于同一列。在逻辑上属于同一数据记录(通常由键标识)的值的集合构成一行。

    对数据库进行分类的方法之一是按数据在磁盘上的存储方式进行分类:按行或按列进行分类。表可以水平分区(将属于同一行的值存储在一起),也可以垂直分区(将属于同一列的值存储在一起)。图1-2描述了这种区别:a)显示了按列分区的值,b)显示了按行分区的值。

    1f9296e6fc161228f108ac15981e2338.png
    ▲图1-2:面向列和行的存储中的数据布局

    面向行的数据库的例子很多:MySQL、PostgreSQL大多数传统的关系数据库。而两个开源的、面向列数据存储的先驱则是MonetDBC-Store(C-Store是Vertica的开源前身)。

    01 面向行的数据布局

    面向行的数据库按记录或来存储数据。它的布局非常接近表格的数据表示方法,即其中每一行都具有相同的字段集合。例如,面向行的数据库可以有效地存储用户条目,其中包含姓名、出生日期和电话号码:

    | ID | Name | Birth Date | Phone Number || 10 | John | 01 Aug 1981 | +1 111 222 333 || 20 | Sam | 14 Sep 1988 | +1 555 888 999 || 30 | Keith | 07 Jan 1984 | +1 333 444 555 |

    这种方法适用于如下的场景:数据记录(姓名、出生日期和电话号码)由多个字段组成且由某个键(在本例中为单调递增的ID)所唯一标识。表示单个用户的数据记录的所有字段通常被一起读取。在创建数据时(例如,当用户填写注册表单时),我们也将它们一起写入数据库。与此同时,我们可以单独修改某个字段。

    在需要按行访问数据的情况下,面向行的存储最有用,将整行存储在一起可以提高空间局部性。

    因为诸如磁盘之类的持久性介质上的数据通常是按块访问的(换句话说,磁盘访问的最小单位是块),所以单个块可能将包含某行中所有列的数据。

    这对于我们希望访问整个用户记录的情况非常有用,但这样的存储布局会使访问多个用户记录某个字段的查询(例如,只获取电话号码的查询)开销更大,因为其他字段的数据在这个过程中也会被读入。

    796b450e139a38c4a1fb232fc59dc203.png

    02 面向列的数据布局

    面向列的数据库垂直地将数据进行分区(即通过列进行分区),而不是将其按行存储。在这种数据存储布局中,同一列的值被连续地存储在磁盘上(而不是像前面的示例那样将行连续地存储)。

    例如,如果我们要存储股票市场的历史价格,那么股票价格这一列的数据便会被存储在一起。将不同列的值存储在不同的文件或文件段中,可以按列进行有效的查询,因为它们可以一次性地被读取出来,而不是先对整行进行读取后再丢弃掉不需要的列。

    面向列的存储非常适合计算聚合的分析型工作负载,例如查找趋势、计算平均值等。如果逻辑记录具有多个字段,但是其中某些字段(在本例中为股票价格)具有不同的重要性并且该字段所存储的数据经常被一起使用,那么我们一般使用复杂聚合来处理这样的情况。

    从逻辑角度看,表示股票市场价格的数据仍旧可以表示为表的形式:

    | ID | Symbol | Date | Price || 1 | DOW | 08 Aug 2018 | 24,314.65 || 2 | DOW | 09 Aug 2018 | 24,136.16 || 3 | S&P | 08 Aug 2018 | 2,414.45 || 4 | S&P | 09 Aug 2018 | 2,232.32 |

    而列式存储则看起来与上述存储布局完全不同—属于同一列的值被紧密地存储在一起:

    Symbol: 1:DOW; 2:DOW; 3:S&P; 4:S&PDate: 1:08 Aug 2018; 2:09 Aug 2018; 3:08 Aug 2018; 4:09 Aug 2018Price: 1:24,314.65; 2:24,136.16; 3:2,414.45; 4:2,232.32

    为了重建数据元组(这对于连接、筛选和多行聚合可能很有用),我们需要在列级别上保留一些元数据,以标识与它关联的其他列中的数据点是哪些。如果你显式地执行此操作,则需要每个值都必须持有一个键,这将导致数据重复并增加存储的数据量。

    针对这种需求,一些列存储使用隐式标识符(虚拟ID),并使用该值的位置(换句话说,其偏移量)将其映射回相关值。

    在过去几年中,可能由于对不断增长的数据集运行复杂分析查询的需求不断增长,我们看到了许多新的面向列的文件格式,如Apache Parquet、Apache ORC、RCFile,以及面向列的存储,如Apache Kudu、ClickHouse,以及许多其他列式数据存储组件。

    3ab25ec040ffff83785eb53d7da174dc.png

    03 区别与优化

    认为行存储和列存储之间的区别仅在于数据的存储方式有所不同,这是不充分的。选择数据布局只是列式存储所针对的一系列可能的优化的步骤之一。

    在一次读取中,从同一列中读取多个值可以显著提高缓存利用率和计算效率。在现代CPU上,向量化指令可以使单条CPU指令一次处理多个数据点。

    另外,将具有相同数据类型的值存储在一起(例如,数字与数字在一起,字符串与字符串在一起)可以提高压缩率。我们可以根据不同的数据类型使用不同的压缩算法,并为每种情况选择最有效的压缩方法。

    要决定是使用面向列还是面向行的存储,你需要了解访问模式。如果所读取的记录中的大多数或所有列都是需要的,并且工作负载主要由单条记录查询和范围扫描组成,则面向行的存储布局可能产生更好的结果。如果扫描跨越多行,或者在列的子集上进行计算聚合,则值得考虑使用面向列的存储布局。

    04 宽列式存储

    面向列的数据库不应与宽列式存储(如BigTable或HBase)相混淆。在这些数据库中,数据表示为多维映射,列被分组为列族(通常存储相同类型的数据),并且在每个列族中,数据被逐行存储。此布局最适合存储由一个键或一组键来检索的数据。

    BigTable论文中的一个典型示例是WebTable。一个WebTable存储着一个带有某个时间戳、包含如下信息的快照:网页内容、属性以及它们之间的关系。

    页面由反向URL所标识,并且所有属性(如页面内容和锚,锚表示页面之间的链接)由生成这些快照的时间戳来标识。简而言之,它可以表示为一个嵌套的映射,如图1-3所示。

    d75789ea936039414dbec764f12fdf81.png
    ▲图1-3:WebTable的概念性结构

    数据存储在具有层次索引的多维排序映射中:我们可以通过特定网页的反向URL来定位与该网页相关的数据,也可以通过时间戳来定位该网页的内容或锚。每一行都按其行键进行索引。

    在列族中,相关列被分组在一起(在本例中为contents和anchor),这些列族分别存储在磁盘上。列族中的每个列都由列键标识,该键是列族名称和限定符(在本例中为html,http://cnnsi.comhttp://my.look.ca)的组合。

    列族可以按照时间戳存储多个版本的数据。这种布局使得我们可以快速定位更高层的条目(在本例中为Web页面)及其参数(不同版本的内容和指向其他页面的链接)。

    理解宽列式存储的概念表示是有用的,而它们的物理布局也有所不同。列族的数据布局示意图如图1-4所示:列族被单独存储,但在每个列族中,属于同一键的数据被存储在一起。

    2f3f9e28d99804380fbbfb89e06b9188.png
    ▲图1-4:WebTable的物理结构

    [声明]本文版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,如涉及作品内容、版权等问题,可联系本站删除,谢谢。

    展开全文
  • 字段是列的交集:某种类型的单个值。属于同一字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将相同的类型,并且属于同一。在逻辑上属于同一数据记录(通常...
  • 字段是列的交集:某种类型的单个值。属于同一字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将相同的类型,并且属于同一。在逻辑上属于同一数据记录(通常...
  • 字段是列的交集:某种类型的单个值。 属于同一字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将相同的类型,并且属于同一。在逻辑上属于同一数据记录(通常...
  • 导读:本文带你了解面向与面向的数据库。作者:Alex Petrov来源:大数据DT(ID:hzdashuju)大多数数据库系统存储一组数据记录,这些记录由表中的组成。字段是列和...
  • 导读:本文带你了解面向与面向的数据库。作者:Alex Petrov来源:大数据DT(ID:hzdashuju)大多数数据库系统存储一组数据记录,这些记录由表中的组成。字段是列和...
  • 什么是列式存储数据库?

    万次阅读 多人点赞 2018-03-14 10:52:46
    存储不同于传统的关系型数据库,其数据在表中存储的,方式所带来的重要好处之一就是,由于查询中的选择规则通过来定义的,因此整个数据库自动索引化的。按存储每个字段的数据聚集存储,在查询只...
  • SQL批量已经多个字段拼接

    千次阅读 2017-04-24 08:30:21
    你想要第一个显示什么,这个ID就要在视图中查出来,不然会数据有误,而且查询速度非常慢。 select  S_Customer.nickName 客户, S_Job.partNum 生产型号, isnull(SO_Num.订单数 - CPCK.出库数量,0)
  • 存储不同于传统的关系型数据库,其数据在表中存储的,方式所带来的重要好处之一就是,由于查询中的选择规则通过来定义的,因此整个数据库自动索引化的。按存储每个字段的数据聚集存储,在查询只...
  • 什么是列存储?

    2012-06-12 16:18:51
    什么是列存储?存储不同于传统的关系型数据库,其数据在表中存储的,方式所带来的重要好处之一就是,由于查询中的选择规则通过来定义的,因 此整个数据库自动索引化的。按存储每个字段的数据聚集...
  • 我正在设计一个大型数据库。...我试图让我的数据库运行良好,查询运行顺利更多,您认为我应该创建一个高效数据库的想法是什么?什么是field 20?MySQL建议使用索引有多种原因,包括消除条件之间的:http://de...
  • Hive转行与

    2021-03-24 23:51:33
    其实就是把多行的数据连接在一起,放到一里面,所用的函数连接函数 concat(xx,xx) 连接到一起 concat_ws(separator, str1, str2,…) 这个多了一个separator分隔符,就是两个字符串之间用什么隔开 collect_...
  • 在 Awk 系列的这一节中,我们将看到 awk 最重要的...Awk 输出字段如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你应该知道什么是内部字段分隔符(IFS)变量。awk 中默认的 IFS 制表符和空格。awk 中...
  • 字段就是一张数据表分为,一就是一跳记录。可能有很多个字段,就是各个属性。比如一张Student 表,里面有studentname,id等字段站一的。他们合起来组成一条记录。 属性通常指对象的性质与对象之间...
  • 本文关于字段、记录、大小的数量限制和合理...单张表多少个字段其实没有什么定论,只要不超过数据库限定的个数就好,但是表的单条记录的大小有合理空间的,也就是需要根据具体硬件和操作系统来确定单条记录(row si
  • 自增列是数据库中值随插入的每个自动增加的一列。它最常用于主键或 ID 字段,这样每次增加一时,不用指该字段的值,它就会自动增加,而且是唯一的。当在 MySQL 中定义列时,我们可以指定一个名为 AUTO_INCREMENT...
  • 如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你应该知道什么是内部字段分隔符(IFS)变量。awk 中默认的 IFS 制表符和空格。 awk 中的字段分隔符的工作原理如下:当读到一输入时,将它按照指定的 IFS...
  • awk 系列:如何使用 awk 输出文本中的字段 在 Awk 系列的这一节中,我们将看到 awk 最重要的特性之一,字段编辑。...如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你应该知道什么是内部字段分隔符(IF...
  • 在 Awk 系列的这一节中,我们将看到 awk 最重要的特性之一,字段编辑。 首先我们要知道,Awk 能够自动将输入...如果你熟悉 Unix/Linux 或者懂得bash shell 编程,那么你应该知道什么是内部字段分隔符(IFS)变量。a...
  • 如何查找重复如何删除重复如何查找多上的重复错误的查询语句几种正确的方法如何查找重复第一步定义什么样的重复。多数情况下很简单:它们某一具有相同的值。本文采用这一定义,或许你对“重复...
  • 动态实现

    2021-02-02 14:30:33
    今天学到一招不需要复杂的SQL函数来实现动态,首先什么是动态,我们来看一个例子。如图1的表设计,我们能看到不同渠道的付款金额、付款订单数量、付款商品件数、付款金额(去税)如果你想要展示不同渠道...
  • 第二节:什么是字段、属性、、元组、记录、表、主键、外键(书25页) 主键:可以作为一张表的唯一标志物 外键:表示该XX 来自 何处 :也叫字段或者属性(一) :字段的组合,称为记录或者元组(一) ...
  • 假设我们有一张数据表 employee(员工表),该表有三个字段(),分别name、age 和address。假设表employee有上万数据(这公司还真大),现在需要从这个表中查找出所有名字‘ZhangSan’的雇员信息,你会快速的写出...
  • sql中标识的作用可以让计算机为表中的记录按照要求自动地生成标识字段的值标识的定义以及特点SQL Server中的标识又称标识符,习惯上又叫自增。该种具有以下三种特点:1、的数据类型为不带小数的数值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,098
精华内容 439
关键字:

列是字段行是什么