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

clickhouse深入浅出

基础知识+原理

极致压缩率 极速查询性能

     列式数据库管理 ,读请求多 大批次更新或无更新  读很多但用很少  大量的列   列的值小数值/短字符串   一致性要求低   

     DBMS:动态创建/修改/删除库 表 视图,动态查/增/修/删,用户粒度设库/表权限,分布式,备份恢复

    向量化执行引擎:优化循环,SIMD CPU寄存器实现数据并行;

    数据分片 分布式查询:1分片对应1服务节点 

         本地表=数据分片,分布式表不存数据,本地表访问代理

    列式存储:减少查询所需要扫描的数据量 

       数据压缩LZ4:步长匹配扫描数据,编码转换重复部分 ;降低IO和存储的压力

多线程:

大小写敏感

多样化表引擎:合并树 内存 文件 接口 

多主架构:对等角色 all节点功能相同  规避单点故障

总结:高效列式存储引擎,实现了数据有序存储、主键索引、稀疏索引、数据Sharding、数据Partitioning、TTL、主备复制等丰富功能

存储层

列式存储:只需要读取参与计算的列,减少io 加速查询

数据有序存储:按某列sort by,相同sort key数据联系存储 有序摆放,少量block 利用page cache

主键索引:每列按index granularity(8192)划分,第一行mark行  二分查找 index granularity 加速查

数据增改删:alter变更,异步执行时立即返回,实际排队等待执行

   mutation:找到分区 重建 新换旧,不可撤 顺序执行 ,推荐一次性更新大量数据

模块

  •    column列对象 field是基础映射单元,不同类型不同实现 columnString columnArray,单个值field聚合13中数据类型和相应处理逻辑 uint64 null  string array
  • dataType序列化反序列化,具体实现=》对应数据类型的实例,数据读取从column field获取
  • block 表的子集,数据 类型 列名组成,ColumnWithTypeAndName聚合column读取数据,dataType序列化
  • block流,IBlockInputStream(60种)读取 关系运算,IBlockOutputStream输出到下一环节 表引擎相关
  • table IStorage接口,子类实现 DDL read write,查询交给Interpreter解释器处理

ClickHouse特性及底层存储原理-CSDN博客

实践

Java Language Client Options for ClickHouse | ClickHouse Docs

实践这个就先不写了,直接上一个完整的博客例子

springboot整合mybatis-plus、clickhouse、mysql多数据源_springboot 配置mysql 和clickhouse双数据源-CSDN博客

GitCode - 开发者的代码家园

SpringBoot2 集成 ClickHouse 实现高性能数据分析_springboot如何集成clickhouse-CSDN博客

问题 

活动及用户+匹配模块 收集 埋点数据 异步kafka 活动等业务消费 MybatisPlus 写入clickhouse

 消费等TPS大几千, too many  parts

     clickhouse最小操作单元block,写入借助zk的唯一自增的blockId,按照PartitionId_blockId_blockId_0生成data parts,后台merge线程 单次耗时5min,分钟内 多个小文件合并成PartitionId_MinBlockNum_MaxBlockBum_Level,32个merge线程池,频繁插入 merge压力大 处理不了,默认clickhouse一次合并超300个文件就报错了

   解决:少批多条  调小写入的并发数,调大批处理数据size间隔 减少文件个数,1s写入一次 

 每次单条写入

     MybatisPlussavebatch 最大sql   4M,最大单次1000条,再多的话便单条写入      

     改为其他方式写入,原生jdbc/flink,自定义sink 一定批次/执行checkpoint写入一次

 写入性能很差

     clickhouse底层使用httpclient,单条频繁写入效率很低  

解决

   定时任务,有数据 放到队列1  当数据过大|10-15s后  队列1放入队列2    队列2批量写入clickhouse 清空队列1 

优化

  25亿数据  耗时比较长 

大部分按照时间来查询,执行计划分析sql

//打印执行日志:执行日志级别trace
clickhouse-client -u xxxx --password xxxxxx --send_logs_level=trace <<< ‘your query sql’ > /dev/null
没有用到主键索引

 空值使用无意义的字符串填充,clickhouse底层将空值单独文件存储,影响性能

 明确select查询字段

 多线程查询

  7天数据放入一个分区,分区查询

  直接使用count()查询数据量

   使用高级函数,multilf argMax 

   聚合外推

号外:RuoYi 

 RuoYi

若依框架的介绍与基本使用(一起走进若依框架的世界)-CSDN博客

相关文章:

clickhouse深入浅出

基础知识原理 极致压缩率 极速查询性能 列式数据库管理 &#xff0c;读请求多 大批次更新或无更新 读很多但用很少 大量的列 列的值小数值/短字符串 一致性要求低 DBMS&#xff1a;动态创建/修改/删除库 表 视图&#xff0c;动态查/增/修/删&#xff0c;用户粒度设库…...

TPS2041A 至 TPS2044A 、TPS2051A 至 TPS2054A

这份文件是德州仪器&#xff08;Texas Instruments&#xff09;关于一系列电流限制型电源分配开关的数据手册&#xff0c;型号包括 TPS2041A 至 TPS2044A 和 TPS2051A 至 TPS2054A。这些开关适用于可能遇到重负载电容负载和短路的应用程序。以下是该数据手册的核心内容概要&…...

Excel从零基础到高手【办公】

第1课 - 快速制作目录【上篇】第1课 - 快速制作目录【下篇】第2课 - 快速定位到工作表的天涯海角第3课 - 如何最大化显示工作表的界面第4课 - 给你的表格做个瘦身第5课 - 快速定位目标区域所在位置第6课 - 快速批量填充序号第7课 - 按自定义的序列排序第8课 - 快速删除空白行第…...

AI图书推荐:如何在课堂上使用ChatGPT 进行教育

ChatGPT是一款强大的新型人工智能&#xff0c;已向公众免费开放。现在&#xff0c;各级别的教师、教授和指导员都能利用这款革命性新技术的力量来提升教育体验。 本书提供了一个易于理解的ChatGPT解释&#xff0c;并且更重要的是&#xff0c;详述了如何在课堂上以多种不同方式…...

Redis中的集群(九)

集群 消息 集群中的各个节点通过发送和接收消息(message)来进行通信&#xff0c;我们称发送消息的节点为发送者(sender),接收消息 的节点成为接收者&#xff0c;如图所示。节点发送的消息主要有以下五种: 1.MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时&#xff0c…...

funasr 麦克风实时流语音识别

参考: https://github.com/alibaba-damo-academy/FunASR chunk_size 是用于流式传输延迟的配置。[0,10,5] 表示实时显示的粒度为 1060=600 毫秒,并且预测的向前信息为 560=300 毫秒。每个推理输入为 600 毫秒(采样点为 16000*0.6=960),输出为相应的文本。对于最后一个语音…...

英语学习笔记-音节划分和字母发音对照表

国际音标 音节划分 英语音节以元音为主体构成的发音单位&#xff0c;一般说来元音发音响亮&#xff0c;可以构成音节&#xff0c;辅音发音不响亮&#xff0c;不能单独构成音节 ((m] (n] [I] 例外)。 从单词拼写形式上看&#xff0c;有几个元字组就有几个音节 音节划分规则 长…...

使用odbc链接dm8数据库

一、环境说明 windows11 VMware Workstation 17 Pro ubuntu22.04 docker $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy因docker版本的dm8中&#xff0c;没有…...

开源项目one-api的k8s容器化部署(上)-- 制作镜像及部署准备

一、背景 最近需要对开源项目one-api进行k8s容器化部署&#xff0c;主要分以下几个步骤&#xff1a; 制作docker镜像申请mysql和redis数据库docker-compose部署方式k8s部署方式 整个的篇幅比较长&#xff0c;将会分成上下两篇来阐述。 二、制作docker镜像 开源项目one-api…...

面试-数据库基础以及MySql、ClickHost、Redis简介

面试-数据库基础以及MySql、ClickHost、Redis简介 0.数据完整性1.数据库并发控制1.1事物1.2 并发读写错误1.3 锁1.3.1 乐观锁与悲观锁1.3.2 共享锁和排他锁1.3.3 行锁与表锁1.3.4 意向锁 1.4 封锁协议与隔离级别1.5 MVCC1.5.1 概念1.5.2 当前读与快照读1.5.3 MVCC in InnoDB 2.…...

MySQL分库分表的方式有哪些

目录 一、为什么要分库分表 二、什么是分库分表 三、分库分表的几种方式 1.垂直拆分 2. 水平拆分 四、分库分表带来的问题 五、分库分表技术如何选型 一、为什么要分库分表 如果一个网站业务快速发展&#xff0c;那这个网站流量也会增加&#xff0c;数据的压力也会随之而…...

数据结构课程设计选做(一)---数字排序(哈希、排序)

2.1.1 题目内容 2.1.1-A [问题描述] 给定n个整数&#xff0c;请统计出每个整数出现的次数&#xff0c;按出现次数从多到少的顺序输出。 2.1.1-B [基本要求] &#xff08;1&#xff09;输入格式&#xff1a; 输入的第一行包含一个整数n&#xff0c;表示给定数字的个数。 第二…...

Linux第90步_异步通知实验

“异步通知”的核心就是信号&#xff0c;由“驱动设备”主动报告给“应用程序”的。 1、添加“EXTI3.c” #include "EXTI3.h" #include <linux/gpio.h> //使能gpio_request(),gpio_free(),gpio_direction_input(), //使能gpio_direction_output(),gpio_get_v…...

elasticdump之python脚本

参考文章目录 elasticdump之shell备份脚本 前言 在企业实际生产环境中,避免不了要对es集群进行迁移、数据备份与恢复&#xff0c;以此来确保数据的可用性及完整性。因此&#xff0c;就涉及到了数据备份与恢复。本章主要以elasticdumppython为主&#xff0c;实现es集群索引备…...

Hystrix应用:如何在Spring Boot中使用Hystrix?

Hystrix应用&#xff1a;如何在Spring Boot中使用Hystrix&#xff1f; 引言 在微服务架构的发展过程中&#xff0c;面对复杂的服务依赖和不可预见的系统故障&#xff0c;如何提升系统的容错能力成为了一个非常急迫且重要的能力。 由 Netflix&#xff08;网飞&#xff09;公司…...

js的常用方法

js的常用方法已经使用过的实例 JavaScript有许多基本方法&#xff0c;这些方法可用于执行各种操作&#xff0c;包括字符串操作、数组操作、数学运算等。以下是一些常用的JavaScript基本方法及简单示例&#xff1a; 一、字符串方法 1、toUpperCase()&#xff1a;将字符串转换为…...

基于SpringBoot实现的在线拍卖系统

系统开发环境 编程语言&#xff1a;Java数据库&#xff1a;MySQL容器&#xff1a;Tomcat工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统实现 管理员功能模块 首页 修改密码 用户管理 商品类型管理 拍卖商品 竞拍公告 轮播图 历史竞拍管理 竞拍订单管理 留言板管理 用户…...

React 组件生命周期对比:Class vs. 函数式

在 React 中&#xff0c;Class 组件和函数式组件的生命周期存在一些差异。通过对 React 中 Class 组件和函数式组件的生命周期进行对比&#xff0c;详细探讨了它们在设计哲学、生命周期管理和开发技巧上的异同。全面了解 React 中两种组件类型的生命周期特点&#xff0c;以及如…...

Ubuntu去除烦人的顶部【活动】按钮

文章目录 一、需求说明二、打开 extensions 网站三、安装 GNOME Shell 插件四、安装本地连接器五、安装 Hide Activities Button 插件六、最终效果七、卸载本地连接器命令参考 本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 一、需求说明 使用 Ubuntu 的过程中&#xff0c;屏…...

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff0c;push是追加历史记录&#xff0c;replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...