目录

1. 主键索引 (Primary Key Index) - 核心是稀疏索引

2. 跳数索引 (Data Skipping Indexes) - 二级索引

3. 关键总结与最佳实践:


ClickHouse的索引设计哲学与其他传统OLTP数据库(如MySQL)有显著不同,它更侧重于高效扫描大数据集快速过滤,而不是点查(Point Lookup)。其核心索引类型如下:

1. 主键索引 (Primary Key Index) - 核心是稀疏索引

    • 原理: 这是ClickHouse最核心的索引机制。它不是传统意义上的B树索引。
    • 数据结构: 本质上是一个稀疏索引。数据在物理存储上严格地按照主键(或ORDER BY键,两者在MergeTree引擎家族中概念等价)排序存储。
    • 粒度: 索引并不是为每一行都建立条目,而是为每个数据部分的每个索引粒度(默认为8192行)记录该粒度内第一行的主键值(称为“标记”)。
    • 工作方式:
      • 当执行带有WHERE条件的查询(特别是涉及主键前缀或范围条件)时,ClickHouse利用这些稀疏的标记值。
      • 它通过二分查找快速定位到可能包含目标数据的数据块(即索引粒度对应的数据段)。
      • 然后,它只加载这些定位到的数据块(.bin文件中的相应部分)到内存中进行扫描和过滤,避免了全表扫描
    • 优势:
      • 内存占用小: 稀疏索引占用的内存远小于稠密索引(如B树)。
      • 范围查询极快: 对于按主键排序的范围查询(如时间范围),效率极高,只需加载少量相关数据块。
      • 高效过滤: 能有效利用主键前缀进行过滤。
    • 局限性:
      • 点查效率较低: 查找单行数据时,可能仍需加载一个完整的数据块(8192行)进行扫描,不如B树高效。ClickHouse不是为高频点查设计的。
      • 依赖主键顺序: 查询条件必须有效利用主键(或ORDER BY键)的前缀才能发挥最大效果。如果查询条件不涉及主键前缀,索引效果会大打折扣甚至无效。
      • 非唯一约束: 声明主键强制唯一性约束,它只定义数据的物理排序顺序和稀疏索引的构建依据。
    • 存储位置: 索引标记存储在内存中(primary.idx文件在磁盘上,启动时加载到内存),查询时进行二分查找速度很快。

2. 跳数索引 (Data Skipping Indexes) - 二级索引

    • 目的: 为了解决主键索引对非主键列(特别是高基数列或查询条件不涉及主键前缀时)过滤效率低下的问题。
    • 原理: 在数据块(索引粒度)级别上存储关于该块内数据的摘要信息(Min/Max, Bloom Filter, 集合等)。查询时,先检查这些摘要信息,如果确定某个数据块内不可能包含满足查询条件的数据,则跳过整个数据块的读取。
    • 核心思想: 跳过不需要扫描的数据块,减少IO和CPU消耗。
    • 类型: ClickHouse提供了多种跳数索引类型,适用于不同的数据类型和查询模式:
      • minmax: 存储每个数据块中指定列的最小值和最大值。适用于数值、日期等有序类型。如果查询条件范围与某个块的min-max范围无重叠,则跳过该块。最简单高效,通常首选。
      • set: 存储每个数据块中指定列的所有唯一值(或一个固定大小的超集)。适用于低中基数列的IN=查询。如果查询值不在块的set中,则跳过该块。存储开销和构建成本随基数增大而增加。
      • bloom_filter: 为每个数据块中的指定列值构建一个布隆过滤器。适用于高基数列的IN=查询,尤其是字符串。可以高效判断某个值“可能不存在”于该块(有一定误判率,但“存在”判断是准确的)。需要配置参数(false_positive概率)。
      • ngrambf_v1 / tokenbf_v1: 基于N-gram或分词构建的布隆过滤器变种,专门优化字符串子串(LIKE, %term%分词搜索的跳过。
      • experimental类型:hypothesis索引(基于统计假设检验)等,用于特定高级场景。
    • 创建:CREATE TABLEALTER TABLE语句中声明。例如:
CREATE TABLE logs (timestamp DateTime,user_id UInt64,url String,...INDEX idx_user_id user_id TYPE set(100) GRANULARITY 4,INDEX idx_url_token url TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 4
) ENGINE = MergeTree
ORDER BY (timestamp, user_id);
      • GRANULARITY: 指定索引的粒度(覆盖多少个主键索引粒度)。GRANULARITY 1表示每个跳数索引条目对应一个主键索引粒度(8192行)。GRANULARITY 4表示一个跳数索引条目对应4个主键索引粒度(32768行)。更大的粒度可以减少索引大小但降低跳过精度。
    • 优势:
      • 显著加速对非主键列(尤其是高基数列)的过滤查询。
      • 减少不必要的磁盘IO和CPU消耗。
    • 局限性:
      • 额外存储和计算开销: 需要存储索引数据,并在写入和合并时计算摘要信息。
      • 可能无效: 如果数据分布使得摘要信息无法有效跳过块(例如所有块的值范围都很大且重叠),则索引效果差。
      • 布隆过滤器误判: bloom_filter类型可能导致不必要的块读取(但不会漏读)。
      • 粒度影响: GRANULARITY设置需要权衡索引大小和跳过精度。

3. 关键总结与最佳实践:

  1. 主键索引是基石: 表设计时,ORDER BY子句(即主键)的选择至关重要。优先选择最常用作过滤条件(尤其是范围过滤)的1-N个列。良好的主键设计能解决大部分高效查询问题。
  2. 跳数索引是补充: 当查询条件无法有效利用主键前缀或涉及高基数的非主键列时,考虑创建合适的跳数索引。
  3. 索引选择:
    • 优先尝试minmax(对有序类型)。
    • 对低基数的IN/=set
    • 对高基数的IN/=或字符串用bloom_filter
    • LIKE/子串搜索用ngrambf_v1/tokenbf_v1
  1. 评估与监控: 使用EXPLAIN indexes = 1查看查询是否使用了索引以及跳过了多少数据块。监控索引的存储开销和查询性能提升是否成正比。
  2. 理解ClickHouse哲学: ClickHouse索引的目标是最小化需要从磁盘读取的数据量,通过预排序(主键索引)数据块摘要(跳数索引) 来实现。它不是为单行检索优化,而是为海量数据分析的聚合和扫描优化。

总而言之,ClickHouse的索引机制是其高性能查询的核心支撑之一。深刻理解主键(稀疏索引)和跳数索引的原理、适用场景以及局限性,是设计和优化ClickHouse表结构、编写高效查询的关键。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

445场周赛

第一题:检查元素频次是否为质数 给你一个整数数组 nums。 如果数组中任一元素的 频次 是 质数,返回 true;否则,返回 false。 元素 x 的 频次 是它在数组中出现的次数。 质数是一个大于 1 的自然数,并且只有两个因数…

【SQL语法汇总】

读音:MySQL —— 卖舌口 MySQL 实际上是DBMS软件系统, 并非数据库。通过系统管理维护数据库,DBMS相当于用户和数据库之间的桥梁。 MySQL是一种关系型数据库, 类似excel,用行和列的关系组织数据数据。 操作关系型数据库的DBMS系统大多数用SQL来管理数据。 SQL是编程语言…

C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。

C法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。 在C中,引用(reference)是一个已存在对象的别名。一旦引用被初始化绑定到一个对象&…

PHP 生成当月日期

一:按日期顺序排列的数组,而不是按周分组的二维数组 /*日期生成 *day: 日期数字 *date: 完整的日期字符串 (YYYY-MM-DD) *is_current_month: 是否属于当前月份 *is_prev_month: 是否是上个月的日期 *is_next_month: 是否是下个月的日期 *is_today: 是否是…

vue3+elementPlus实现无缝滚动表格封装

vue3+elementPlus+css+js 模拟liMarquee插件,实现无限滚动效果 功能:1、表格数据大于一定数量之后,开始向上滚动 2、当鼠标移入的时候,动画停止,鼠标移出,继续动画 3、滚动动画的速度可以自定义 4、表格的高度固定 5、向上滚动时,无限滚动,不存在卡顿 <template>…

AI赋能企业内训:2025智能化教育培训系统源码开发全解析

从线下集中授课到线上碎片化学习&#xff0c;从被动灌输到主动交互&#xff0c;越来越多企业开始关注“企业内训系统”的智能化升级。而这一切的背后&#xff0c;离不开AI技术的深度赋能。 笔者认为&#xff0c;2025年将是企业内训系统“从信息化走向智能化”的关键拐点。本篇…

旅游安全急救实训室:构建旅游行业安全人才培养新范式

在文旅产业蓬勃发展与安全应急需求日益凸显的背景下&#xff0c;旅游安全急救能力已成为从业者的核心素养之一。当前&#xff0c;旅游市场突发状况频发&#xff0c;如景区意外事故、游客突发疾病等&#xff0c;对从业人员的急救技能提出了更高要求——既要掌握基础急救操作&…

网络编程及原理(六):三次握手、四次挥手

目录 一 . TCP 的核心机制&#xff1a;连接管理 二 . 三次握手&#xff1a;建立连接 &#xff08;1&#xff09; 三次握手的意义 &#xff08;1.1&#xff09;初步验证通信链路是否流畅 &#xff08;1.2&#xff09;确认通信双方各自的发送、接受能力是否正常 &…

【LLaMA 3实战】2、LLaMA 3对话能力全解析:从架构革新到多智能体实战指南

引言:LLaMA 3对话能力的革命性突破 当Meta发布LLaMA 3时,其对话能力的跃升重新定义了开源大模型的边界。这款拥有128K上下文窗口的开源模型,不仅在MT-Bench评测中超越GPT-3.5,更通过分组查询注意力(GQA)等架构创新,实现了推理速度30%的提升。 本文将从底层架构到应用实战…

面试题-在ts中类型转换的方法

在 TypeScript 中&#xff0c;类型转换主要分为 类型断言&#xff08;Type Assertion&#xff09;、类型守卫&#xff08;Type Guard&#xff09; 和 类型兼容转换 三种方式。以下是详细分类和示例&#xff1a; 一、类型断言&#xff08;Type Assertion&#xff09; 强制编译…

IIS配置SSL证书

公司的一个项目使用IIS部署的网站&#xff0c;现在需要更新SSL证书。为了下次方便&#xff0c;在此做记录整理。 以下第一部分是查网络AI查询到的资料&#xff0c;解决了我心中对双击和从IIS导入有什么不同的疑惑。第二部分是我在这次实际操作过程中的截图。 一.证书安装方式 …

K8s初始化容器与边车容器比对

Kubernetes 中的初始化容器和边车容器 Kubernetes 作为一个开源容器编排平台&#xff0c;引入了强大的概念来管理和增强 Pod 内容器的功能。其中两个概念是初始化容器&#xff08;Init Containers&#xff09;和边车容器&#xff08;Sidecar Containers&#xff09;。尽管这两…

无线Debugger攻防全解:原理剖析与突破之道

引言​​ 在Web安全防护体系中&#xff0c;反调试技术已成为对抗爬虫和分析的关键武器。2023年OWASP报告显示&#xff0c;Top 1000网站中92%部署了反调试机制&#xff0c;其中​​无线Debugger技术​​&#xff08;也称为无限Debug&#xff09;因其难以破解的特性&#xff0c;…

Eslint自定义规则使用

文章目录 前言场景设定&#xff1a;维护代码分层&#xff0c;禁止“跨级调用”实现步骤&#xff1a;从零到一&#xff0c;创建你的第一条自定义规则**第 1 步&#xff1a;创建规则文件****第 2 步&#xff1a;在 eslint.config.mjs 中注册并启用你的规则** 验证成果 前言 设计…

深入剖析Spring Cloud Gateway,自定义过滤器+断言组合成拦截器链实现Token认证

一、Spring Cloud Gateway网关的整体架构 Spring Cloud Gateway 是 Spring Cloud 官方推出的网关解决方案&#xff0c;旨在替代 Netflix Zuul 1.x。其底层基于 Spring WebFlux Reactor 模型 构建&#xff0c;具备响应式、异步非阻塞的高性能特点。 1. 整体架构图 ----------…

VMware Workstation Pro下Centos 7.9 安装

背景系统安装方案1、VMware安装    1.1、下载    1.2、安装 2、Centos 7.9 安装    2.1 、Centos7.9 iso 下载    2.2、使用VMware 安装    2.2.1、VMware配置虚拟机    2.2.2、Linux安装 结语 背景 本文所在专栏的所有文章基于Centos7.9系统来演示&#xff0c;系…

我做个一个APP叫【图影工具箱】:一站式解决视频提取音频和加水印的鸿蒙神器

在数字内容创作和日常使用手机的过程中&#xff0c;提取视频音频、处理图片和视频水印是一大需求。许多人在寻找合适的软件时&#xff0c;往往试遍各种工具却仍无法满足需求。所以&#xff0c;我做了一款应用 —— 图影工具箱&#xff0c;一站式解决这些令人头疼的问题。 图影…

【StarRocks系列】查询语句执行全流程

目录 StarRocks 查询数据流程详解 1. 提交查询语句 2. FE 解析与优化 3. 选择 BE 节点与数据路由 4. BE 数据读取与计算 5. 结果返回 关键优化点总结 示例流程 流程图 StarRocks 查询数据流程详解 StarRocks 采用分布式 MPP 架构&#xff0c;查询流程涉及 FE&#xff…

HarmonyOS 5的分布式通信矩阵是如何工作的?

HarmonyOS 5 的分布式通信矩阵通过多层级技术协同实现跨设备高效协同&#xff0c;其核心工作机制如下&#xff1a; 一、核心架构&#xff1a;分布式软总线 3.0‌ ‌动态拓扑感知‌ 设备自动发现并构建最优传输路径&#xff08;如手机与智慧屏优先采用 Wi-Fi P2P 直连&#xf…

自定义Django rest_framework中response的示例

在实际项目开发中&#xff0c;原有框架的response可能并不能完全满足我们的需求。比如我们需要定义一些更加详细的RESULT_CODE来说明情况。那么我们就可以基于原有的response进行自定义。 下面是一个自定义Django rest_framework中response的示例 # -*- coding:utf-8 -*- imp…