前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两种主要列存储方式的区别

两种主要列存储方式的区别

作者头像
哒呵呵
发布2018-08-06 17:17:07
1.4K0
发布2018-08-06 17:17:07
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

Bigtable,HBase,Hypertable和Cassandra都被称为列存储,因为它们能够单独存储和访问列族。 这使它们看起来与列存储(如Sybase IQ,C-Store,Vertica,VectorWise,MonetDB,ParAccel和Infobright)处于相同的类别,这些列存储也可以单独访问列。 我认为,称呼这两个系统的列存储导致了大量的混乱和错误的预期。这篇博客文章试图澄清一些这种混乱,突出这些集合系统之间的高级差异。 最后,我将提出一些可能的方法来重命名这些组,以避免将来混淆。

对于本博客文章,我将引用以下两个组作为组A和组B:

•组A:Bigtable,HBase,Hypertable和Cassandra。 这四个系统不是A组系统的完整列表 - 这些仅仅是我在这个类别中最了解的四个系统,并且感到最有自信的讨论。

•组B:Sybase IQ,C-Store,Vertica,VectorWise,MonetDB,ParAccel和Infobright。 同样,这不是一个完整的列表,但这些是我最熟悉的系统。(从这个讨论中忽略诸如Oracle或Greenplum的行/列混合系统以避免混淆,但是这些系统的列存储方面比组A更接近组B)

A和B的区别:

  1. 数据模型:数据模型。组A使用多维映射(稀疏,分布式,持久多维排序映射)。 通常,行名,列名和时间戳足以唯一地映射到数据库中的值。 B组使用传统的关系数据模型。 这种区别造成了很大的混乱。 更熟悉A组的人非常清楚,A组不使用关系数据模型,并假设由于B组也称为列存储,则B组也不使用关系数据模型。 这导致许多聪明的人说“列存储不是关系”,这是完全不正确的。
  2. 列的独立性:组A将数据实体或“行”的部分存储在单独的列族中,并且能够单独访问这些列族。这意味着并非行的所有部分都在存储器中的单个I / O操作中被拾取,如果只有行的子集与特定查询相关,这被认为是一件好事。然而,列族可能由许多列组成,列族中的这些列不能单独访问。组B分别存储来自传统关系数据库表的列,以便可以单独访问它们。与A组类似,这对仅访问任何特定查询中的表属性子集的查询很有用。 但是,主要区别是每个列都是单独存储的,而不是像A组中那样的列族(此语句忽略B组中的细粒度混合选项)。
  3. 接口:组A是作为NoSQL的一部分,并且通常不具有传统的SQL接口。 B组支持标准SQL接口。
  4. 优化工作负载:B组主要针对读取分析工作负载进行了优化。这些系统支持合理快速的加载时间,但高更新率往往是有问题的。因此,数据仓库是B组的理想市场,因为它们通常是批量加载的,需要许多复杂的读取查询,并且很少更新。相比之下,组A可以处理更多样化的应用程序需求集合(特别是Cassandra可以处理更高的更新速率)。 B组系统倾向于在“获取”或“放置”数据集中的各个行的工作负载上挣扎着,但是在需要在单个查询中扫描许多行的大聚合和总计上得到良好优化。相比之下,组A通常对单个行查询效果更好,并且在聚合负载较重的工作负载上性能不佳。这种差异的大部分原因可以在系统之间的“纯列”与“列家族”差异中解释。 A组系统可以将倾向于共同访问的属性放在同一列族中;这节省了由于列存储需要在许多不同位置从相同行找到不同属性而导致的搜索成本。导致区别的另一个原因是存储层实现,在下面解释。
  5. 存储层:

虽然在组B中的系统中存在一些变化,但是对于第一级近似,该组将以以下方式存储表:

(ID)1,2,3,4,5,6

(名字)乔,杰克,吉尔,詹姆斯,杰米,贾斯汀

(姓氏)史密斯,威廉姆斯,戴维斯,米勒,威尔逊,泰勒

(Phone)555-1234,555-5668,555-5432,NULL,555-6527,555-8247

(电子邮件)jsmith@gmail.com,jwilliams@gmail.com,NULL,jmiller@yahoo.com,NULL,jtaylor@aol.com

请注意,每个值都是自己存储的,没有关于它来自哪个行或列的信息。我们可以找出它来自哪个列,因为来自同一列的所有值都是连续存储的。我们可以通过计算在同一列中有多少值来计算它来自哪一行。 id列中的第四个值匹配到与姓氏列中的第四个值相同的行以及电话列中的第四个值等。请注意,这意味着必须明确存储特定行的未定义的列作为列在列表中的NULL;否则我们不能再根据它们在相应列表中的位置来匹配值。

同时,组A中的系统将为每个值显式存储行名称,列名称或二者。例如:row2,lastname:Williams;row5,phone:555-6527等。原因是组A使用稀疏数据模型(不同的行可以定义非常不同的列集合)。为每个未定义的列存储NULL可能很快导致大多数数据库填充NULL。因此,这些系统将显式地为列族中的一行中的每个元素或单个列column-family中的每个元素的行名/值对提供列名/值对。 (组A通常还会存储每个值的时间戳,但解释这只会使这个讨论复杂化)。

这导致组B通常比组A(至少对于容易适合于关系模型的结构化数据)占用更少的存储空间。此外,通过仅存储列值而没有列名或行名称,B组优化了列操作的性能,其中读取列中的每个元素并应用操作(如谓词评估或聚合)。因此,与存储层实现结合的数据模型导致A组和B组的非常不同的目标应用程序。

重命名组名:

显然,沿着这五个维度中的每一个,组A和组B是非常不同的。 因此,即使调用它们两个列存储有一些优点(它使得看起来像“列存储运动”是一个真正的热门),我们需要作出更大的努力,以避免将来这两组混淆。以下是A组和B组为实现这一目标而提出的一些建议:

•组A:“列族存储”

组B:“列存储”(这里的问题是组B没有得到新名称,这意味着“列存储”可以指代组B或组A / B)

•组A:“非关系列存储”

•组B:“关系列存储”

•组A:“稀疏列存储”

•组B:“密集列存储”

其中,关系/非关系的区别可能是最重要的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档