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

news2025/7/11 4:46:23

在数据库存储中,列式存储(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!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逻辑回归 (Logistic Regression)

文章目录 逻辑回归 (Logistic Regression)问题的引出Sigmoid function逻辑回归的解释决策边界 (Decision boundary)逻辑回归的代价函数机器学习中代价函数的设计1. 代价函数的来源(1)从概率模型推导而来(统计学习视角)&#xff08…

燕山大学计算机网络之Java实现TCP数据包结构设计与收发

觉得博主写的好,给博主点点免费的关注吧! 目录 摘要.................................................................................................................... 4 前言.............................................................…

JavaEE——线程安全

目录 前言1.线程安全的定义2.线程安全问题产生的原因2.1 多个线程修改一个变量2.2 修改操作不是原子的2.3 内存可见性引起的线程安全问题 3.解决线程安全问题的方法3.1 通过synchronized关键字加锁3.2 使用volatile关键字 总结 前言 在使用多线程的时候,难免会出现…

[redis进阶一]redis的持久化(2)AOF篇章

目录 一 为什么有了RDB持久化机制还要有AOF呢 板书介绍具体原因: ​编辑二 详细讲解AOF机制 (1)AOF的基本使用 1)板书如下 2)开启AOF机制: 3) AOF工作流程 (2)AOF是否会影响到redis性能 ​编辑 (3)AOF缓冲区刷新策略 (4)AOF的重写机制 板书如下: 为什么要有这个重写机…

【Linux我做主】探秘gcc/g++和动静态库

TOC Linux编译器gcc/g的使用 github地址 有梦想的电信狗 前言 在软件开发的世界中,编译器如同匠人的工具,将人类可读的代码转化为机器执行的指令。 对于Linux开发者而言,gcc和g是构建C/C程序的核心工具链,掌握它们的原理和使…

Vue3中发送请求时,如何解决重复请求发送问题?

文章目录 前言一、问题演示二、使用步骤1.One组件2.Two组件封装工具函数处理请求 总结 前言 在开发过程中,重复请求发送问题可能会导致数据不一致、服务器压力增加或用户操作异常。以下是解决重复请求问题的常见方法和最佳实践: 一、问题演示 我们看着…

观察者模式:从博客订阅到消息队列的解耦实践

观察者模式:从博客订阅到消息队列的解耦实践 一、模式核心:用事件驱动实现对象间松耦合 在新闻 APP 中,当热点事件发生时需要实时通知所有订阅用户;在电商系统中,库存变化需触发价格监控模块重新计算。这类场景的核心…

ReportLab 导出 PDF(页面布局)

ReportLab 导出 PDF(文档创建) ReportLab 导出 PDF(页面布局) ReportLab 导出 PDF(图文表格) PLATYPUS - 页面布局和排版 1. 设计目标2. 开始3. Flowables3.1. Flowable.draw()3.2. Flowable.drawOn(canvas,x,y)3.3. F…

【CVE-2024-10929】ARM CPU漏洞安全通告

安全之安全(security)博客目录导读 目录 一、概述 二、CVE详情 三、受影响产品 四、建议措施 五、致谢 六、版本历史 一、概述 在部分基于Arm架构的CPU中发现了一个潜在安全问题,称为Spectre-BSE(Branch Status Eviction,分支状态驱逐…

OpenCV 图形API(33)图像滤波-----高斯模糊函数gaussianBlur()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用高斯滤波器对图像进行模糊处理。 该函数使用指定的高斯核对源图像进行滤波。输出图像必须与输入图像具有相同的类型和通道数。 cv::gapi::g…

【2025最新版】火鸟门户v8.5系统源码+PC、H5、小程序 +数据化大屏插件

一.介绍 火鸟地方门户系统V8.5源码 系统包含4端: PCH5小程序APP 二.搭建环境 系统环境:CentOS、 运行环境:宝塔 Linux 网站环境:Nginx 1.2.22 MySQL 5.6 PHP-7.4 常见插件:fileinfo ; redis 三.测…

关于 传感器 的详细解析,涵盖定义、分类、工作原理、常见类型、应用领域、技术挑战及未来趋势,结合实例帮助理解其核心概念

以下是关于 传感器 的详细解析,涵盖定义、分类、工作原理、常见类型、应用领域、技术挑战及未来趋势,结合实例帮助理解其核心概念: 一、传感器的定义与核心功能 1. 定义 传感器(Sensor)是一种能够将物理量&#xff…

EtherCAT转ProfiNet边缘计算网关配置优化:汽车制造场景下PLC与机器人协同作业案例

1.行业背景与需求分析 智能汽车焊装车间是汽车制造的核心工艺环节,某德国豪华品牌在其上海MEB工厂新建的焊装车间中,采用西门子S7-1500PLC作为ProfiNet主站,负责整线协调与质量追溯;同时部署KUKAKR1500Titan机器人(Eth…

HTTP协议 --- 超文本传输协议 和 TCP --- 传输控制协议

是基于 TCP 协议的 80 端口的一种 C/S 架构协议。 特点:无状态 --- 数据传输完成后,会断开 TCP 连接,哪怕浏览器还正常运行。 请求报文 --- 方法 响应报文 --- 状态码 是一种面向连接的可靠传输协议 。 面向连接 --- 在传输数据之前&am…

类和对象(下篇)(详解)

【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 #include <iostream> using name…

LeetCode【剑指offer】系列(位运算篇)

剑指offer15.二进制中1的个数 题目链接 题目&#xff1a;编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为 汉明重量).&#xff09;。 思路一&#xff…

网络安全领域的AI战略准备:从概念到实践

网络安全领域的AI准备不仅涉及最新工具和技术的应用&#xff0c;更是一项战略必需。许多企业若因目标不明确、数据准备不足或与业务重点脱节而未能有效利用AI技术&#xff0c;可能面临严重后果&#xff0c;包括高级网络威胁数量的激增。 AI准备的核心要素 构建稳健的网络安全…

MacOs下解决远程终端内容复制并到本地粘贴板

常常需要在服务器上捣鼓东西&#xff0c;同时需要将内容复制到本地的需求。 1-内容是在远程终端用vim打开&#xff0c;如何用vim的类似指令达到快速复制到本地呢&#xff1f; 假设待复制的内容&#xff1a; #include <iostream> #include <cstring> using names…

基于PAI+专属网关+私网连接:构建全链路 Deepseek 云上私有化部署与模型调用架构

DeepSeek - R1 是由深度求索公司推出的首款推理模型&#xff0c;该模型在数学、代码和推理任务上的表现优异&#xff0c;市场反馈火爆。在大模型技术商业化进程中&#xff0c;企业级用户普遍面临四大核心挑战&#xff1a; 算力投入成本高昂&#xff1a;构建千亿参数级模型的训…

【cocos creator 3.x】cocos creator2.x项目升级3.x项目改动点

1、基本改动 基本改动&#xff1a;去掉了cc.&#xff0c;改成在顶部添加导入 项目升级时候直接将cc.去掉&#xff0c;根据提示添加引用 node只保留position,scale,rotation,layer 其余属性如opacity&#xff0c;如果需要使用需要在节点手动添加UIOpacity组件 3d层和ui层分开…