当前位置: 首页 > article >正文

中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)

1、概述

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发,并于2016年开源。专为大规模数据分析,实时数据分析和复杂查询设计,具有高性能、实时数据和可扩展性等特点。

2、主要特性

(1)、列式存储

  • 原理:
    将数据按列存储,而非传统的行式存储(如 MySQL)。
    • 优势:
      • 高效查询:仅读取相关列,减少I/O开销,尤其是对于聚合类操作时,性能非常高效。
      • 高压缩率:相同列的数据压缩效率更高(如ZSTD、LZ4算法)。
      • 向量化执行:CPU 可批量处理同一列的多行数据,提升计算速度。

(2)、MPP架构(分布式处理)

  • MPP(大规模集群并行处理):
    支持分布式计算,查询可拆分为多个任务并行执行,具有良好的扩展性。
    • 分布式表:
      将数据分片(Shard)存储在多个节点,查询时自动合并结果。
    • 副本机制:
      每个分片可配置多个副本(Replica),确保高可用性。

(3)、高性能查询引擎

  • 向量化执行:
    以 数据块(Block) 为单位处理数据(默认 8192 行/块),利用 SIMD 指令加速计算。
  • 预计算与索引:
    • Projection(投影):预定义数据的排序、过滤和聚合规则,查询时直接使用预处理数据。
    • 物化视图(Materialized View):预先计算复杂查询结果,实时更新。

(4)、SQL 支持

基本使用类似Mysql,熟悉SQL的用户可以快速上手。

  • 功能丰富:
    • 支持标准 SQL(SELECT、JOIN、GROUP BY 等)。
    • 扩展函数:如数组操作(arrayJoin)、窗口函数(ROW_NUMBER)、聚合函数(quantile)。
  • 实时写入:
    支持批量插入(INSERT)和流式数据(如 Kafka、MySQL Binlog)。

(5)、分布式与扩展性

  • 集群模式:
    通过 Distributed 表引擎管理分片和副本,自动负载均衡。
  • 数据分区(Partition):
    按时间或字段分区(如 PARTITION BY toYYYYMM(date)),加速范围查询。

(6)、安全与权限

  • RBAC(基于角色的访问控制):
    支持用户、角色、行级权限管理。
  • 数据加密:
    支持 SSL/TLS 加密传输,存储加密需依赖外部工具。

(7)、多核并行处理

能够充分利用现代服务器的多核架构,提高查询执行速度。

(8)、外部存储集成

除了本地文件系统之外,还支持从HDFS等多种外部存储系统中读取数据。

3、适用场景

ClickHouse非常适合需要快速响应的大规模数据查询任务。

(1)、大数据分析‌

如用户行为分析、广告点击统计,支持PB级数据的多维分析‌。
特别适合那些需要对大量历史数据进行复杂查询分析的业务场景。

(2)、实时数据分析与监控‌

生成实时业务指标(如电商 GMV、DAU),广告网络及RTB(实时竞价),支持高并发查询‌。

(3)、日志存储与检索‌

高效压缩存储日志数据(如 Nginx 日志),快速检索关键信息,电信行业中的通话记录分析‌。

4、架构特点

(1)、分布式MPP架构‌

通过分片(Sharding)和副本(Replication)实现数据分布式存储与计算,支持跨节点并行查询‌。

(2)、存储引擎‌

  • 核心表引擎:
    • MergeTree 家族:
      • MergeTree:基础引擎,支持排序、分区、数据合并。
      • RepliatedMergeTree:分布式场景下保证数据一致性。
      • TinyLog/StripeLog:简单存储引擎,无并发控制(适合小数据测试)。
  • 其他引擎:
    • Memory:内存表,重启后数据丢失。
    • Distributed:分布式表,协调分片查询。

(3)、高效压缩与数据类型‌

每列独立选择压缩算法(如 LZ4、ZSTD),支持 UInt/Int 系列、日期/时间、字符串等丰富数据类型‌。

(4)、数据写入机制

  • 追加写入(Append-Only):
    数据以 块(Block) 形式追加到磁盘,不可直接更新或删除(需 ALTER TABLE … DELETE 语句,但性能较低)。
  • Merge Tree 合并:
    定期合并小数据块为大块,优化查询性能。

5、使用示例

(1)、查询执行流程:

  • 查询解析:
    SQL 转换为执行计划,优化器选择最优路径。
  • 并行执行:
    查询拆分到多个分片,每个分片在本地执行。
  • 结果聚合:
    各节点返回结果后,协调节点合并最终结果。

(2)、具体示例:

1. 创建表

– 使用 MergeTree 引擎,按日期分区,按订单ID排序

CREATE TABLE orders (order_id UInt32,customer_id UInt32,product_id UInt32,order_date Date,order_amount Float32
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(order_date)
ORDER BY order_id;
2. 数据插入

– 批量插入提升效率

INSERT INTO orders VALUES
(1, 101, 1001, '2024-07-01', 500.0),
(2, 102, 1002, '2024-07-01', 300.0),
(3, 103, 1003, '2024-07-02', 700.0);
3. 复杂查询

– 订单金额按日期聚合

SELECT order_date,COUNT(order_id) AS order_count,SUM(order_amount) AS total_amount
FROM orders
GROUP BY order_date
ORDER BY order_date;

6、使用建议

(1)、性能优化

  • 分区表:
    按时间或高频查询字段分区(如 PARTITION BY toYYYYMM(date))。

  • Projection(投影):
    预定义数据排序和过滤规则,加速特定查询。
    sql示例:
    CREATE PROJECTION orders_projection
    (order_date, customer_id, order_amount)
    PARTITION BY toYYYYMM(order_date)
    ORDER BY (customer_id, order_date)
    SETTINGS index_granularity = 8192;

  • 批量插入:
    减少单次插入数据量,避免频繁小批量操作。

  • 合理索引:
    使用 MARK 或稀疏索引(如 index_granularity)加速范围查询。

(2)、分布式配置

  • 分片策略:
    根据查询热点合理分配分片,避免数据倾斜。
  • 副本机制:
    每个分片至少 3 个副本,确保高可用性。

(3)、资源管理

  • 内存控制:
    调整 max_memory_usage 防止查询 OOM。
  • 日志与监控:
    使用 system.parts、system.merges 监控数据合并状态。

7、局限性和适用场景

(1)、局限性

  • 不支持复杂事务:
    仅保证单行写入原子性,不支持 ACID 事务。
  • 数据更新与删除:
    通过 ALTER TABLE … DELETE 语句实现,但性能较低(建议通过新数据覆盖旧数据)。
  • 索引限制:
    仅支持基于主键的排序索引,不支持 B-Tree 索引。

(2)、适用场景

  • OLAP 场景:
    高并发查询、实时分析、大数据量(TB/PB 级)。
  • 读多写少:
    适合批量写入、频繁读取的场景(如日志分析、报表生成)。

(3)、不适用场景

  • OLTP 场景:
    高频事务性操作(如订单系统)。
  • 复杂事务:
    需要多行事务或细粒度更新的场景。

8、与其他数据库的对比

在这里插入图片描述

9、社区与生态

  • 开源社区:
    GitHub 仓库:https://github.com/ClickHouse/ClickHouse。
  • 企业支持:
    ClickHouse Inc. 提供云服务(ClickHouse Cloud)和企业版(高级功能、技术支持)。
  • 工具生态:
    • 客户端:clickhouse-client、DBeaver。
    • ETL 工具:Airflow、Kafka、Debezium。

10、ClickHouse总结

ClickHouse是一款专为高性能OLAP分析设计的列式数据库,凭借列式存储、分布式架构和实时分析能力,特别适合处理海量数据的实时查询和复杂分析。

不过,其局限性在于不支持事务和行级更新,更适用于读多写少、批量写入的分析型业务‌。
在选择使用ClickHouse之前,也需要考虑其相对复杂的配置(如:表结构、使用Projection、分布式配置)和调优过程,以及与其他系统集成时可能遇到的挑战。

逆风翻盘,Dare To Be!!!

相关文章:

中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)

1、概述 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发,并于2016年开源。专为大规模数据分析,实时数据分析和复杂查询设计,具有高性能、实时数据和可扩展性等…...

Java中的经典排序算法:插入排序、希尔排序、选择排序、堆排序与冒泡排序(如果想知道Java中有关插入排序、希尔排序、选择排序、堆排序与冒泡排序的知识点,那么只看这一篇就足够了!)

前言:排序算法是计算机科学中的基础问题之一,它在数据处理、搜索算法以及各种优化问题中占有重要地位,本文将详细介绍几种经典的排序算法:插入排序、选择排序、堆排序和冒泡排序。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解…...

K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战

系列文章目录 k8s服务注册到consul prometheus监控标签 文章目录 系列文章目录前言一、环境二、Prometheus部署1.下载2.部署3.验证 三、kube-prometheus添加自定义监控项1.准备yaml文件2.创建新的secret并应用到prometheus3.将yaml文件应用到集群4.重启prometheus-k8s pod5.访…...

uniapp-商城-25-顶部模块高度计算

计算高度: 使用computed进行顶部模块的计算。 总高度:bartotalHeight log 介绍--收款码这一条目 也就是上一章节的title的高度计算 bodybarheight。 在该组件中: js部分的代码: 包含了导出的名字: shop-head…...

Proxmox VE 网络配置命令大全

如果对 Proxmox VE 全栈管理感兴趣,可以关注“Proxmox VE 全栈管理”专栏,后续文章将围绕该体系,从多个维度深入展开。 概要:Proxmox VE 网络配置灵活,满足虚拟化组网需求。基础靠桥接实现虚拟机与物理网络互联&#x…...

非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较 一、引言二、非关系型数据库(NoSQL)2.1 优势 三、关系型数据库(RDBMS)3.1 优势 四、结论 💖The Begin💖…...

WPF 图标原地旋转

如何使元素原地旋转 - WPF .NET Framework | Microsoft Learn <ButtonRenderTransformOrigin"0.5,0.5"HorizontalAlignment"Left">Hello,World<Button.RenderTransform><RotateTransform x:Name"MyAnimatedTransform" Angle"…...

蓝桥杯2024国B数星星

小明正在一棵树上数星星&#xff0c;这棵树有 n 个结点 1,2,⋯,n。他定义树上的一个子图 G 是一颗星星&#xff0c;当且仅当 G 同时满足&#xff1a; G 是一棵树。G 中存在某个结点&#xff0c;其度数为 ∣VG​∣−1。其中 ∣VG​∣ 表示这个子图含有的结点数。 两颗星星不相…...

Ubuntu 系统上通过终端安装 Google Chrome 浏览器

使用终端安装前&#xff0c;需要配置好终端使用了代理。 参考文章&#xff1a;https://blog.csdn.net/yangshuo1281/article/details/147262633?spm1011.2415.3001.5331 转自 风车 首先&#xff0c;添加 Google Chrome 的软件源和密钥&#xff1a; # 下载并添加 Google 的签…...

中科院1区顶刊Expert Systems with Applications ESO:增强型蛇形算法,性能不错

Snake Optimizer&#xff08;SO&#xff09;是一种优化效果良好的新颖算法&#xff0c;但由于自然规律的限制&#xff0c;在探索和开发阶段参数更多是固定值&#xff0c;因此SO算法很快陷入局部优化并慢慢收敛。本文通过引入新颖的基于对立的学习策略和新的动态更新机制&#x…...

zk(Zookeeper)实现分布式锁

Zookeeper实现分布式锁 1&#xff0c;zk中锁的种类&#xff1a; 读锁&#xff1a;大家都可以读&#xff0c;要想上读锁的前提&#xff1a;之前的锁没有写锁 写锁&#xff1a;只有得到写锁的才能写。要想上写锁的前提是&#xff1a;之前没有任何锁 2&#xff0c;zk如何上读锁 创…...

自我生成,自我训练:大模型用合成数据实现“自我学习”机制实战解析

目录 自我生成&#xff0c;自我训练&#xff1a;大模型用合成数据实现“自我学习”机制实战解析 一、什么是自我学习机制&#xff1f; 二、实现机制&#xff1a;如何用合成数据实现自我训练&#xff1f; ✅ 方式一&#xff1a;Prompt强化生成 → 自我采样再训练 ✅ 方式二…...

【Vue】从 MVC 到 MVVM:前端架构演变与 Vue 的实践之路

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–架构模式的演变背景​三–MVC&#xff1a;经典的分层起点​四–MVP&#xff1a;面向接口的解耦尝试​五–MVVM&#xff1a;数据驱动的终极形态​​六–Vue&#xff1a;MVVM 的现代化实践​​​ 二. 架构模…...

prototype`和`__proto__`有什么区别?如何手动修改一个对象的原型?

在 JavaScript 中&#xff0c;prototype 和 __proto__ 都与原型链相关&#xff0c;但它们的角色和用途有本质区别&#xff1a; 1. prototype 和 __proto__ 的区别 特性prototype__proto__归属对象仅函数对象拥有&#xff08;如构造函数&#xff09;所有对象默认拥有&#xff0…...

Flask+Influxdb+grafna构建电脑性能实时监控系统

Influx下载地址&#xff0c;这里下载了以下版本influxdb-1.8.5_windows_amd64.zip 运行前需要先启动Influx数据库&#xff1a; 管理员方式运行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf&#xff0c;以influxdb.conf配置文件启动数…...

关于链接库

在 C# 中&#xff0c;链接库主要分为两种类型&#xff1a;托管链接库和非托管链接库&#xff0c;以下为你详细介绍它们的特点和导入方式&#xff1a; 托管链接库 特点 托管链接库通常是用 .NET 兼容的语言&#xff08;如 C#、VB.NET 等&#xff09;编写的&#xff0c;运行在…...

若伊微服务版本教程(自参)

第一步 若伊官网下载源码 https://ruoyi.vip/ RuoYi-Cloud: &#x1f389; 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统&#xff0c;同时提供了 Vue3 的版本 git clone 到 本地 目录如下&#xff1a; 第二部 参考官网 运行部署说明 环境部署…...

数据库性能优化(sql优化)_分布式优化思路01_yxy

数据库性能优化_分布式优化思路01 1 分布式数据库的独特挑战2 分布式新增操作符介绍2.1 数据交换操作符(ESEND/ERECV):2.2 数据迭代操作符GI:3 核心优化策略(一)_分区裁剪优化3.1 普通分区裁剪3.2 动态分区裁剪1 分布式数据库的独特挑战 在分布式数据库系统中,核心为数据被…...

ESP32与STM32哪种更适合初学者?

目录 1、ESP32&#xff1a;物联网时代的“网红” 2、STM32&#xff1a;工业界的“常青树” 3、到底谁更容易&#xff1f; 无论是刚入坑的小白&#xff0c;还是想扩展技术栈的老鸟&#xff0c;在选择主力 MCU 时&#xff0c;学习曲线绝对是重要的考量因素。ESP32 以其强大的 …...

秒杀秒抢系统开发:飞算 JavaAI 工具如何应对高并发难题?

秒杀、秒抢活动已成为电商促销与吸引流量的常用手段。然而&#xff0c;此类活动所带来的高并发访问&#xff0c;对系统性能构成了巨大挑战。如何确保系统在高并发场景下依然能够稳定、高效运行&#xff0c;成为开发者亟待解决的关键问题。飞算 JavaAI 工具作为一款功能强大的开…...

未启用CUDA支持的PyTorch环境** 中使用GPU加速解决方案

1. 错误原因分析 根本问题&#xff1a;当前安装的PyTorch是CPU版本&#xff0c;无法调用GPU硬件加速。当运行以下代码时会报错&#xff1a;model YOLO("yolov8n.pt").to("cuda") # 或 .cuda()2. 解决方案步骤 步骤1&#xff1a;验证CUDA可用性 在Pyth…...

C# 将Excel格式文件导入到界面中,用datagridview显示

界面按钮不做介绍。 主要代码: //用于获取从上一个页面传过来datagridview标题 public DataTable GetHeader { get; set; } private void UI_EXPINFO_Load(object sender, EventArgs e) { //页面加载显示listbox1中可…...

Spring Boot整合难点?AI一键生成全流程解决方案

在当今的软件开发领域&#xff0c;Spring Boot 凭借其简化开发流程、快速搭建项目的优势&#xff0c;成为了众多开发者的首选框架。然而&#xff0c;Spring Boot 的整合过程并非一帆风顺&#xff0c;常常会遇到各种难点。而飞算 JavaAI 的出现&#xff0c;为解决这些问题提供了…...

分享一下这几天在公司学到的东西

这几天我学到了很多东西 &#xff08;1&#xff09;我自己原来写项目&#xff0c;前后端联调用的都是postman&#xff0c;然后直接测试接口&#xff0c;然后连一下就完了。这几天我接触到了apifox的Mock这个东西&#xff01;我知道了一个前端工程师进行前后端链条的时候&#…...

Java转Go日记(一):Slice解密

1.切片通过函数&#xff0c;传的是什么&#xff1f; package mainimport ("fmt""reflect""unsafe" )func main() {s : make([]int, 5, 10)PrintSliceStruct(&s)test(s) }func test(s []int) {PrintSliceStruct(&s) }func PrintSliceStr…...

MySQL 锁机制全景图:分类、粒度与示例一图掌握

✅ 一、按粒度分类&#xff08;锁的范围大小&#xff09; 1. 表级锁&#xff08;Table Lock&#xff09; 锁住整张表粒度大&#xff0c;开销小&#xff0c;并发性差常见于&#xff1a;MyISAM 引擎 &#x1f4cc; 示例&#xff1a; LOCK TABLES user WRITE; -- 会锁住整个 u…...

STM32江科大----------PID算法

声明&#xff1a;本人跟随b站江科大学习&#xff0c;本文章是观看完视频后的一些个人总结和经验分享&#xff0c;也同时为了方便日后的复习&#xff0c;如果有错误请各位大佬指出&#xff0c;如果对你有帮助可以点个赞小小鼓励一下&#xff0c;本文章建议配合原视频使用❤️ 如…...

架构师面试(二十九):TCP Socket 编程

问题 今天考察网络编程的基础知识。 在基于 TCP 协议的网络 【socket 编程】中可能会遇到很多异常&#xff0c;在下面的相关描述中说法正确的有哪几项呢&#xff1f; A. 在建立连接被拒绝时&#xff0c;有可能是因为网络不通或地址错误或 server 端对应端口未被监听&#x…...

基础学习(4): Batch Norm / Layer Norm / Instance Norm / Group Norm

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1 batch normalization(BN)2 Layer normalization (LN)3 instance normalization (IN)4 group normalization (GN)总结 前言 对 norm/batch/instance/group 这…...

局域网内Docker镜像共享方法

在局域网内将Docker镜像构建并传输到另一台电脑&#xff0c;可以通过以下几种方法实现。以下是具体步骤及注意事项&#xff0c;结合不同场景的适用方案&#xff1a; 方法一&#xff1a;使用 docker save 和 docker load 传输镜像文件 步骤说明 在构建机上保存镜像 通过 docker…...