从底层原理上理解ClickHouse 中的稀疏索引
稀疏索引(Sparse Indexes)是 ClickHouse 中一个重要的加速查询机制。与传统数据库使用的 B-Tree 或哈希索引不同,ClickHouse 的稀疏索引并不是为每一行数据构建索引,而是为数据存储的块或部分数据生成索引。这种索引的核心思想是通过减少需要扫描的数据范围来加速查询,特别适用于大数据量场景。
1. 基本概念:数据存储与索引
在理解稀疏索引之前,首先需要理解 ClickHouse 的列式存储和数据块概念。
数据块(Parts)
-
ClickHouse 将数据以列为单位存储,每次插入的数据被分成多个块(称为 Parts)。每个块中的数据按某种顺序(通常基于主键或排序键)进行排序,且在磁盘上被压缩。
-
每个 Part 的大小通常为数百万到数千万行数据。稀疏索引的设计目的是减少在处理查询时必须扫描的块数。
稀疏索引
- 稀疏索引是建立在这些数据块之上的元数据索引。它记录了每个数据块的某些关键信息(例如块中第一行的排序键值)。查询时,ClickHouse 可以通过稀疏索引跳过不相关的块,避免对全表数据进行扫描。
2. 稀疏索引的工作原理
稀疏索引的主要工作方式是基于 排序键 或 主键 来组织数据和加速查询。其核心逻辑可以分为以下几个步骤:
数据排序
- 当数据被插入到表中时,如果指定了主键或排序键,ClickHouse 会按排序键对数据进行排序并将其存储为多个块。在数据插入过程中,ClickHouse 会在每个数据块内保存该块中第一行的数据的排序键值。
构建索引
- 对于每一个块,ClickHouse 只记录每隔一定数量行的排序键的值(如每 8192 行)。这个值被称为 索引步长(index granularity)。稀疏索引实际上是一种间隔采样,记录在每个块中的起始排序键的值。
查询时的索引扫描
-
当执行查询时,ClickHouse 首先会读取索引中记录的排序键值,通过这些键值判断哪些数据块可能包含满足查询条件的数据。
-
具体来说,查询过程会通过比较查询条件与稀疏索引中的排序键值,确定是否需要扫描一个数据块。比如,如果一个块的起始键值和查询条件不匹配,那么整个块就会被跳过,避免不必要的 I/O。
3. 具体查询优化过程
假设有一个表,数据按时间戳排序,并且有一个包含数十亿行的数据集。查询条件是查找某个特定时间范围内的数据。
-
查询分析:查询引擎首先分析查询条件,确定涉及的列和条件(如时间戳的范围)。
-
索引过滤:引擎会先访问稀疏索引,该索引记录了每个块中第一行的时间戳。通过将查询条件与索引中的时间戳进行比较,查询引擎会快速确定哪些块可能包含匹配的行。
-
数据块过滤:只对那些可能包含匹配行的块进行扫描。这意味着稀疏索引将帮助跳过大量不相关的数据块,从而减少数据扫描的范围。
-
精确扫描:对于可能匹配的块,查询引擎会进行实际的数据扫描,提取符合条件的行。这时,具体的列压缩和向量化执行引擎会进一步提高查询效率。
4. 稀疏索引与传统索引的区别
-
稀疏索引 vs. B-Tree 索引:B-Tree 是一种每行记录都构建索引的结构,非常适合精确查找,但维护代价较高。稀疏索引则是为整个数据块生成索引,只记录部分行的信息,因此维护成本较低,并且非常适合大规模数据的批量查询。
-
稀疏索引 vs. 全表扫描:与全表扫描相比,稀疏索引大幅减少了数据扫描量。虽然它不会像 B-Tree 那样实现每一行数据的查找优化,但通过跳过不相关的数据块,稀疏索引仍能显著提高查询性能。
5. 稀疏索引的优化与配置
ClickHouse 允许用户通过一些配置参数调整稀疏索引的行为,以适应不同的使用场景:
-
索引步长(index_granularity):该参数定义了在稀疏索引中,每隔多少行采集一次索引信息。步长越小,索引越密集,查询时可能跳过的块越少,但扫描量会更多。相反,步长越大,索引越稀疏,跳过的块越多,但有时会导致不必要的块扫描。
-
merge_tree_min_bytes_for_seek:该参数控制了在扫描数据块时,何时进行索引查找。其目的是在数据块较小时(例如单个块的数据很少),可能不需要通过索引来加速,因为查找本身的开销可能超过扫描整个块的成本。
6. 稀疏索引的限制
稀疏索引的设计虽然有效,但在某些场景下也有局限性:
-
不适用于高基数列:由于稀疏索引依赖于排序键,高基数列(如随机数或用户 ID)通常不适合作为排序键,因为数据分布过于稀疏,无法有效跳过大量数据块。
-
对小查询效果有限:如果查询的数据范围非常小(例如单行查找),稀疏索引的优势不明显,因为它主要是在批量查询中通过跳过大数据块来节省时间。
-
适用于大范围扫描:稀疏索引非常适合大范围扫描(例如时间范围查询、范围查询等),但对于精确查询效果一般。
7. 总结
ClickHouse 的稀疏索引通过记录部分数据块的排序键信息,帮助查询引擎快速确定哪些块包含可能满足条件的数据,从而减少不必要的块扫描。这种索引设计非常适合大规模批量数据分析场景,能够有效提高查询速度,特别是在按排序键进行范围查询时。然而,它并非万能,对于高基数列或小范围精确查询,稀疏索引的效果可能不如其他传统索引结构明显。
稀疏索引的核心优势在于其简洁、高效、维护成本低,适用于数据量巨大、查询复杂的 OLAP 场景。
相关文章:
从底层原理上理解ClickHouse 中的稀疏索引
稀疏索引(Sparse Indexes)是 ClickHouse 中一个重要的加速查询机制。与传统数据库使用的 B-Tree 或哈希索引不同,ClickHouse 的稀疏索引并不是为每一行数据构建索引,而是为数据存储的块或部分数据生成索引。这种索引的核心思想是通…...
xtu oj 锐角三角形
锐角三角形 题目描述 n条边,任选3条边,能组成多少个锐角三角形(选的边不同就认为是不同的三角形)? 输入 第一个是一个整数T(1≤T≤1000),表示样例的个数。 每个样例占2行,第一行是一…...
MATLAB系列04:循环结构
MATLAB系列04:循环结构 4. 循环结构4.1 while循环4.2 for循环4.2.1 运算的细节4.2.2 break语句和continue语句4.2.3 嵌套循环 4.3 逻辑数组和向量化4.3.1 逻辑数组的重要性4.3.2 用 if/else 结构和逻辑数组创建等式 4.4 总结 4. 循环结构 循环(loop)是一种 MATLAB …...
虹科方案 | 精准零部件测试!多路汽车开关按键功能检测系统
欢迎关注虹科,为您提供最新资讯! #LIN/CAN总线 #零部件测试 #CAN数据 导读 在汽车制造业中,零部件的安全性、功能性和可靠性是确保车辆整体性能的关键。虹科针对车辆零部件的LIN/CAN总线仿真测试,提出了基于虹科Baby-LIN系列产…...
【加密算法基础——AES CBC模式代码解密实践】
AES 解密实践之代码实现 AES 解密使用python脚本比较灵活,但是一定要保证脚本是调试过的,才能在找到正确的密文,密钥,初始向量的情况下,解出正确的明文。但是对于AES解密,命令行无法处理key截断的问题。 实…...
【ViT+Dis】Deepfake Detection Scheme Based on Vision Transformer and Distillation
文章目录 Deepfake Detection Scheme Based on Vision Transformer and Distillationkey points深伪检测检测算法蒸馏法与教师网络实验训练:参数总结Deepfake Detection Scheme Based on Vision Transformer and Distillation 会议:2021 作者: key points 以往基于CNN结…...
maya-vray渲染蒙版
要用一个叫vrayMulWrapper的材质球,把alpha Conterbution调到-1,勾选matte surface启用蒙版物体。...
计网简简单单复习一下
文章目录 基础体系结构(分层模型)为什么要分层?OSI 七层模型?每一层的作用?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议每一层常见协议有哪些?从输入 URL 到页面展示到底发生了什么?URI和URL的区别;forward和redirect的区别DNS作用是什么?D…...
PyQt5-loading-圆环加载效果
效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…...
RabbitMQ Spring客户端使用
注解声明式队列和交换机 java自带序列化工具类,将java对象序列化为字节数组,用于网络传输。 jdk序列号存在缺陷,(不安全,占用空间大等) 推荐使用JSON的序列化: springboot扫描包使配置生效&…...
Arduino IDE离线配置第三方库文件-ESP32开发板
简洁版可以使用uget等,将文件下载到对应文件夹下,然后安装。 esp32之arduino配置下载提速 录屏 Arduino IDE离线配置第三方库文件ESP32 资源 Linux https://download.csdn.net/download/ZhangRelay/89749063 第三方开发板 非默认支持的开发板 linu…...
Node.js 安装及项目实践
node.js安装 node安装,选择版本 一直next,或者自己修改路径,添加两个包 选择自己的安装的node的路径,cmd或者winr cmd 显示node与npm的版本号 node -vnpm -v可以跟着这个博客将node安装 2024最新版Node.js下载安装及环境配…...
如何从混合信号中剔除某一信号——Schmidt正交化的使用(信号互相关)
本文仅用作方法记录,不讲详细原理和底层逻辑。 在面对混合的接收信号的情况下,例如接收信号: Y a 1 X 1 a 2 X 2 a 3 X 3 N Ya_1X_1a_2X_2a_3X_3N Ya1X1a2X2a3X3N 假设信号 X 1 X_1 X1、 X 2 X_2 X2、 X 3 X_3 X3在时域和频域上…...
I2C/IIC学习笔记
I2C/IIC 有些同学I2C和IIC分不清,I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写,而IIC是它的另一种表述方式,代表的是同一个意思,即“集成电路间总线”。I2C是一种由飞利浦公司(现恩智浦半…...
Servlet学习详解--基本涵盖所有Servlet知识点
目录 一、Servlet二、 Servlet入门2.1. 执行原理2.2. 实现Servlet接口重写其五个方法及其生命周期 三、Request请求对象3.1. 获取请求消息数据3.2. 获取请求头数据3.3. 获取请求体数据3.4. 设置编码3.5. 其他通用功能3.6. 请求转发(Forward)3.7. 转发共享数据 四、Response对象…...
LabVIEW机械手视觉引导系统
开发了LabVIEW软件和硬件工具开发的高精度机械手视觉引导系统。系统通过高效的视觉识别和精确的机械操作,提升工业自动化领域的生产效率和操作精度。 项目背景: 随着工业自动化的不断发展,对生产效率和精确度的要求也日益增高。传统的机械手…...
rabbitmq容器化部署
需求 容器化部署rabbitmq服务 部署服务 找到如下官网信息版本 官网版本发布信息 这里看到最新版本是3.13版本,这里在3.13中找一个版本下载容器镜像即可。 找到dockrhub.com中 找到3.13.2版本镜像。 容器服务安装此处省略 现在下载容器镜像需要配置容器代理 ~#…...
如何用 Helm Chart 安装指定版本的 GitLab Runner?
本分分享如何使用 Helm 来在 Kubernetes 集群上安装极狐GitLab Runner。整体步骤分为:Helm 的安装、vaules.yaml 文件的配置、Runner 的安装、Runner 的测试。 极狐GitLab 为 GitLab 在中国的发行版,中文版本对中国用户更友好。极狐GitLab 支持一键私有…...
el-table使用合计和固定列时,滚动条被覆盖区域无法拖拽问题
pointer-events文档 解决思路为通过pointer-events实现事件穿透,不响应固定列的拖拽,而是响应其子元素的拖拽事件 /deep/.el-table__fixed, /deep/.el-table__fixed-right {pointer-events: none; } /deep/.el-table__fixed *, /deep/.el-table__fixed-…...
【疑难杂症2024-005】docker-compose中设置容器的ip为固定ip后,服务无法启动
本文由Markdown语法编辑器编辑完成。 1.背景: 我们的产品是通过docker image的方式发布,并且编排在docker-compose.yml中发布。在同一个docker-compose.yml中的服务,相互之间,可以通过对方的服务名和端口,来直接访问…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
