首页 > 其他分享 >列存储与宽列存储的区别

列存储与宽列存储的区别

时间:2024-10-23 17:42:54浏览次数:1  
标签:存储 区别 数据库 宽列 查询 2024 数据

列存储(ColumnStores)和宽列存储(Wide ColumnStores)是两种不同类型的数据存储和查询优化技术,主要用于为大数据和分析设计的数据库。虽然两者都基于列式数据存储模型,但在数据组织、查询性能和使用案例方面存在显著差异。

 

1. 列存储(传统列式数据库)

与逐行存储数据的传统关系数据库不同,ColumnStore(或称列式数据库)以列而非行为单位存储数据。这种存储模式针对需要扫描大量数据但每次只扫描列子集的分析查询进行了优化。

 

举例说明: 在传统的基于行的数据库(RowStore)中,一个有 5 列的表会将整行的数据存储在一起,但在 ColumnStore 中,每一列的值都存储在一起,这样就更便于分析查询时只扫描必要的列。

 

工作原理

·在列存储中,表中的每一列都是单独存储的,通常会进行压缩,并编制索引以加快检索速度。

·当查询只请求特定列时,数据库可以只读取这些列,而不是整行,从而提高性能。

 

主要特点

·高效压缩: 由于每一列存储的数据类型相同,因此 ColumnStores 可以实现更高效的压缩。

·减少 I/O: 由于不会读取无关列,因此只需要特定列的查询处理速度更快。

·针对聚合和扫描进行了优化: 最适合数据仓库中常用的聚合函数(如 SUM、AVG)和全表扫描的查询。

 

举例说明: 假设有一个包含以下列的表sales:

CREATE TABLE Sales (
    SaleID INT,
    CustomerID INT,
    ProductID INT,
    SaleAmount DECIMAL,
    SaleDate DATE
);

在列式存储中,数据会按照以下方式存储:

· 列 1 (SaleID): 1, 2, 3, 4, 5, ...
· 列 2 (CustomerID): 101, 102, 103, 101, 104, ...
· 列 3 (ProductID): 1001, 1002, 1003, 1004, 1001, ...
· 列 4 (SaleAmount): 200.50, 150.75, 300.20, 100.00, ...
· 列 5 (SaleDate): 2024-01-01, 2024-01-02, 2024-01-03, ...

查询每个客户的销售总额时:

SELECT CustomerID, SUM(SaleAmount) FROM Sales GROUP BY CustomerID;

数据库只需扫描 CustomerID 和 SaleAmount 列,从而提高了性能。

使用案例

· 数据仓库和 OLAP: 非常适合大规模分析查询,在这种查询中,只有列的子集被频繁访问(如 Amazon Redshift、Google BigQuery、ClickHouse)。

· 金融数据分析: 在查询具有聚合功能的大型数据集时,如计算每个地区的总收入。

· 日志分析: 扫描系统日志或遥测数据中数百万行的特定字段。

 

2. 宽列存储(Wide ColumnStores)

宽列存储(也称为宽列数据库或类 Bigtable 数据库)以灵活的模式在表中存储数据,其中每一行可以有不同数量的列。这些也是列存储,相关列存储在一起。宽列存储通常用于设计用于跨分布式系统水平扩展的 NoSQL 数据库。例如 Apache Cassandra、Google Bigtable 和 HBase 等数据库就是宽列存储的常见例子。

工作原理

· 在 Wide ColumnStore 中,列被分组成家族(families)。每个家族存储在一起,单个行可以包含系家族中的不同列。它允许稀疏和密集的列家族,为模式提供了灵活性。

·数据根据行键(row keys)存储

主要特点

· 动态Schema: 表中的每一行都可以有不同的列集,这在物联网或社交媒体等数据结构可能不同的应用中非常有用。

· 横向可扩展性: Wide-ColumnStores 针对分布式存储系统进行了优化,可跨机器集群处理大型数据集。

· 高写入吞吐: 这些数据库专为处理高吞吐量写入而设计,因此非常适合写入数据。

 

举例说明: 假设有一个 Cassandra 表,用于跟踪具有动态属性(例如,一些用户有年龄,而另一些用户有位置和偏好)的用户活动:

CREATE TABLE UserActivity (
    UserID UUID PRIMARY KEY,
    ActivityID UUID,
    ActivityType TEXT,
    Timestamp TIMESTAMP,
    Age INT,
    Location TEXT,
    Preferences TEXT
);

在宽列存储中,每一行可以有不同的列集合:

· 第 1 行: { UserID: 1, ActivityID: 101, ActivityType: "login", Timestamp: "2024-11-01", Age: 30 }
· 第 2 行: { UserID: 2, ActivityID: 102, ActivityType: "purchase", Timestamp: "2024-11-02", Location: "New York", Preferences: "Sports" }
· 第 3 行: { UserID: 3, ActivityID: 103, ActivityType: "click", Timestamp: "2024-11-03", Location: "California" }

根据应用程序的需要,每一行都可以存储不同的属性。

使用案例

· 物联网数据: 每个设备可能会发送不同类型的遥测数据,因此灵活的模式至关重要。

· 时间序列数据: 金融市场数据等应用,其中一些行存储定价数据,而另一些行存储交易量。

·社交媒体或事件跟踪: 存储用户操作(点赞、分享、发帖),不同用户可能会生成不同类型的数据。

 

3.列存储与宽列存储的区别

特性

ColumnStore (Traditional Columnar Database)

Wide ColumnStore (Wide-Column Database)

Schema Structure

固定的Schema 结构,列单独存储

动态的Schema 结构,使用列家族;每行可以含有不同的列

Optimization

为分析型和读负载重场景做了优化

为写吞吐高和大的分部式数据集做了优化

Storage Model

列以压缩和索引格式存储

列家族将相关列存储在一起;支持稀疏数据。

Query Focus

是分析查询和 OLAP 工作负载的理想选择,侧重于特定列。

重点关注大规模、高吞吐量写入工作负载和灵活查询

Scalability

对于读取量大、基于列的查询,其扩展性很好

为跨分布式集群(如 Cassandra、HBase)的水平扩展性而构建。

Best For

数据仓库、商业智能应用、财务分析

物联网应用、社交媒体平台、时间序列数据、事件跟踪

Compression Efficiency

同质柱状数据存储带来高压缩

压缩效率较低,因为行与行之间的列可能相差很大

Example Databases

Amazon Redshift, Google BigQuery, ClickHouse.

Cassandra, HBase, Google Bigtable.

标签:存储,区别,数据库,宽列,查询,2024,数据
From: https://www.cnblogs.com/abclife/p/18467878

相关文章

  • 钩子函数(HOOK)和回调函数(CALLBACK)有什么区别 ?
     一般认为,钩子函数就是回调函数的一种,差异地方就是:触发的时机不同,钩子函数在捕获消息的第一时间就执行,而回调函数是捕获结束时,最后一个被执行的系统钩子,用于获取系统句柄​钩子处理函数是一个用户定义的回调函数,用于处理特定类型的事件。需要注意的是,系统钩子可能对性能造成......
  • 什么是虚函数和纯虚函数?以及区别
    什么是虚函数和纯虚函数?以及区别?虚函数:定义:被virtual关键字修饰的成员函数。在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。其用法格式为:virtual函数返回类型函数名(参数表){函数体}。特性:虚函数实现多态性,通过指向派生类的基类指针或引用,访问派......
  • Java中super和this的用法和区别
    一、this是自身的一个对象,代表对象本身,可以理解为指向对象本身的一个指针this是用来访问本类实例属性和方法的,它会先从本类中找,如果本类中找不到则在父类中找this属性使用:用来赋值本类属性(最常见的用法),写类时的setter方法eg:publicvoidsetId(intid){this.id=i......
  • ShaderType与Queue区别
    RenderType与Queue的区别指定RenderType的名称,主要是为了替换渲染方式;而Queue是设定渲染顺序。RenderTypeRenderType通常使用的值包括:Opaque:用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。Transparent:用于半透明着色器(透明着色器、粒子着色......
  • IDE和IDEA的定义和区别
    IDE(集成开发环境)定义:IDE是集成开发环境的缩写,是一种用于提供程序开发环境的应用程序。它集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。特点:IDE旨在提高开发人员的生产力,简化开发过程,并......
  • Cmake中“目标层级“的概念(target_include_directories和include_directories的区别)
    CMake中,“目标层级”(Target-Level)是一个核心概念,涉及到项目中构建的具体实体,如可执行文件、库等。理解目标层级对于有效地使用现代CMake功能、管理依赖关系以及配置构建过程至关重要。以下将详细解释什么是目标层级、其重要性以及如何在CMake中应用相关命令。什么是“......
  • Vue 2 和 Vue 3 区别(解析组合式与选项式)
    Vue2和Vue3在组件的组织方式上有一些重要的区别,主要体现在选项式API(OptionsAPI)和组合式API(CompositionAPI)上。下面我将详细介绍这两种API的区别,并提供相应的代码示例。选项式API(OptionsAPI)选项式API是Vue2中最常用的API风格,它通过选项来组织组件的逻......
  • 对象存储服务MinIO-快速入门-集成项目
    对象存储服务MinIOMinIO简介MinIO基于ApacheLicensev2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux,OSX和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。MinIO......
  • SpringBoot-集成腾讯云对象存储Cos-快速入门
    腾讯云对象存储COS一准备工作1注册腾讯云首先注册与登录等腾讯云,官网地址:https://cloud.tencent.com/2开通腾讯云对象存储COS腾讯云对象存储COS:官网地址:https://cloud.tencent.com/product/cos3进入控制台创建存储桶填写信息第二页直接默认就好这里的请求......
  • SpringBoot-集成阿里云OSS对象存储
    阿里云OSS-对象存储一介绍阿里云对象存储OSS(ObjectStorageService),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。在我们使用了阿里云OSS对象存储服务之后,我们的项目当中如果涉及......