中间件--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 开销。
- 行式存储(MySQL):
(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)!