代码改变世界

列存储与宽列存储的区别

2024-10-23 17:52  abce  阅读(121)  评论(0编辑  收藏  举报

列存储(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.