自学内容网 自学内容网

中间件--ClickHouse-3--列式存储和行式存储理解

在数据库存储中,列式存储(Columnar Storage)与行式存储(Row-based Storage)是两种不同的数据组织方式,它们各自适用于不同类型的应用场景。

1、行式存储(MySQL)

  • 存储方式:
    将一行数据的所有字段存储在一起(例如:学生表中的一行包含 学号、姓名、数学成绩、语文成绩 等字段)。
    示例:
1: [学号=001, 姓名=张三, 数学=90, 语文=85]2: [学号=002, 姓名=李四, 数学=88, 语文=92]
  • 读取特点:
    查询时需读取整行数据,即使只需要某一列(如 数学成绩)。

2、列式存储(ClickHouse)

  • 存储方式:
    将同一列的数据存储在一起(例如:所有学生的 学号 存储在一块,所有 数学成绩 存储在另一块)。
    示例:
学号列: [001, 002]
姓名列: [张三, 李四]
数学列: [90, 88]
语文列: [85, 92]
  • 读取特点:
    查询时只读取需要的列(如仅读取 数学成绩 列),避免读取无关数据。

3、列式存储的核心优势

(1)、减少 I/O 开销

  • 场景:
    假设有一个1000万行的学生表,每行包含 学号、姓名、数学成绩、语文成绩 四个字段。
    • 行式存储(MySQL):
      如果需要查询所有学生的 数学成绩平均值,MySQL 需要读取所有行的 全部字段,再筛选出 数学成绩。
    • 列式存储(ClickHouse):
      只读取 数学成绩 列的数据,避免读取其他列,减少 I/O 开销。

(2)、高压缩率

  • 原理:
    同一列的数据类型相同且通常具有相似性(如 数学成绩 列多为 0-100 的整数),压缩算法(如 LZ4、ZSTD)能显著压缩数据。
    • 示例:
      数学成绩 列压缩后可能仅占原始数据的 1/10,而 姓名 列(字符串)压缩率更高。

(3)、向量化执行加速查询

  • 向量化执行:
    ClickHouse 以 数据块(Block) 为单位处理数据(默认 8192 行/块),利用 CPU 的 SIMD 指令 批量计算同一列的多行数据。
    • 对比:
      行式存储需逐行计算(如 数学成绩累加 需逐行循环),而列式存储可一次性处理整列数据,速度提升 数十倍

(4)、适合分析场景

  • 典型查询:
    sql示例:
  -- 查询数学成绩平均值(仅需读取数学列)
  SELECT AVG(math_score) FROM students;
  • 行式存储:需读取所有行的全部字段。
  • 列式存储:直接读取 math_score 列,速度更快。

4、列式存储的局限性

虽然列式存储在分析场景中优势显著,但也有以下限制:

(1)、写入效率较低:

插入一行数据时,需将该行的 每个字段 写入对应的列文件,写入开销较大。

  • 适用场景:ClickHouse 适合批量写入(如每小时导入一次日志数据),而非高频事务性操作。

(2)、不支持复杂事务:

列式存储设计为 追加写入(Append-Only),更新或删除操作需通过新数据覆盖旧数据,性能较差。

  • 适用场景:适合写少读多的分析场景(如日志分析、报表生成)。

5、实际场景对比

(1)、日志分析

  • 需求:统计某日所有用户访问的 平均响应时间。
    • 数据表结构:
CREATE TABLE logs (
    user_id String, 
    request_time DateTime, 
    response_time Float32, 
    ip String
);
  • 查询:
SELECT AVG(response_time) FROM logs WHERE request_time >= '2024-01-01';
  • 性能对比:
    在这里插入图片描述

(2)、实时报表

  • 需求:统计某电商网站 各省份的销售额。
    • 数据表结构:
CREATE TABLE orders (
    order_id UInt64, 
    province String, 
    amount Float32, 
    create_time DateTime
);
  • 查询:
   SELECT province, SUM(amount) FROM orders GROUP BY province;
  • 性能对比:
    ClickHouse 可直接读取 province 和 amount 列,利用 向量化聚合 快速计算结果,速度非常快;而 MySQL 需读取全表数据,在对指定的列进行聚合,相对慢。

6、如何选择?

在这里插入图片描述

7、扩展思考

  • 为什么列式存储适合大数据分析?
    因为 80% 的分析查询仅涉及少数列,列式存储能显著减少 I/O 和计算量。
  • 列式存储的压缩如何工作?
    例如,数学成绩 列的值集中在 0-100 之间,使用 LZ4 压缩后,相同数据的存储空间可能仅为行式存储的 1/10。

通过理解列式存储的这些特性,可以更好地选择适合业务场景的数据库,例如:

  • 日志分析、用户行为分析:用 ClickHouse。
  • 订单系统、用户登录:用 MySQL。

逆风翻盘,Dare To Be!!!


原文地址:https://blog.csdn.net/qq_34207422/article/details/147202494

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!