专栏首页鸿的学习笔记两种主要列存储方式的区别

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

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:“密集列存储”

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

本文分享自微信公众号 - 鸿的学习笔记(shujuxuexizhilu),作者:鸿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 简单聊聊数据存储格式

    在现实生活中存在着两个不同的数据处理模型,一个是OLTP,另一个是OLAP。两者的区别不在这篇文章详细叙述,感兴趣的可以阅读参考文章。因为OLAP和OLTP所面...

    哒呵呵
  • 计算应该与存储分离吗?

    这篇文章构思了很久,因为我不是做计算机底层研究的,也没做过数据库,一直在应用层打转转,最多读过几篇相关的文章,所以担心我的知识储备不够写这么一篇比较严肃的话题,...

    哒呵呵
  • python的抽象基类

    与jvm上的语言不一样,python的语言没有interface关键字,而且除了抽象基类,每个类都有相应的接口:类实现或继承的公开属性(方法或数据类型)

    哒呵呵
  • 数据迁移与一致性思考与实践

    在上一篇中我们讲了通用优惠券系统的设计,这篇主要是以优惠券重构后,我们现有系统接入到该通用优惠券系统过程中遇到的数据迁移与一致性问题相关的思考与实践。我们早期的...

    榴莲其实还可以
  • 如何利用公共云存储构建中小企业存储

    内部部署的超融合基础设施对于中小企业来说非常适合,这消除了对SAN存储及其相关技能的需求,但是,对于希望实现存储基础设施现代化的中小企业,有许多方法可以从云存储...

    静一
  • 网盘倒闭 解读未来数据存储模式变化

    导读:移动存储领域存在移动云存储和传统硬件存储两大分支,原本这两大分支在各自领域都有着相当的发展。然而,近期各大云存储厂商或停止服务或阉割功能或有偿服务,让原本...

    钱塘数据
  • 存储04-存储的三种类型:块/文件/对象

    存储按照对外提供服务的方式分为:块存储、文件存储、对象存储。块存储即我们日常说的SAN存储;文件存储即我们日常说的NAS存储;对象存储是最近几年才兴起的一种存储...

    大话IT架构
  • 干货 | 如何评估Kubernetes持久化存储方案

    从用户角度看,存储就是一块盘或者一个目录,用户不关心盘或者目录如何实现,用户要求非常“简单”,就是稳定,性能好。为了能够提供稳定可靠的存储产品,各个厂家推出了各...

    焱融科技
  • 如何利用公共云存储构建中小企业存储

    中小型企业(SME)的技术需求虽然比大企业的少,但仍然很重要。其中的关键是中小企业的存储。

    CloudBest
  • 深度||全球存储二十年并购回顾,中国存储何时迎来春天?

    1998--2018年是全球存储工业从崛起走向成熟的二十年。回顾这二十年全球存储市场的并购之路,我们发现收购金额超过10亿美金的重要收购超过50个,涵盖了从传统...

    大数据在线

扫码关注云+社区

领取腾讯云代金券