Apache Doris 索引的全面剖析与使用指南

搞大数据开发的都知道,想要在海量数据里快速查数据,就像在星图里找一颗特定的星星,贼费劲。不过别慌,数据库索引就是咱们的 “定位神器”,能让查询效率直接起飞!就拿 Apache Doris 这个超火的分析型数据库来说,它支持好几种索引,每种都有自己的 “独门绝技”,能在不同查询场景下大显身手。今天就带大家好好研究下 Apache Doris 的索引,看看它到底是怎么做到这么牛的!
在这里插入图片描述

一、索引的分类与原理

(一)点查索引:精准狙击数据点

前缀索引:排序键上的 “捷径”

Apache Doris 的数据存储采用类似 SSTable 的有序结构,按照指定列排序存储。在建表时,如 Aggregate、Unique 和 Duplicate 三种数据模型,会依据各自建表语句中的 Aggregate Key、Unique Key 和 Duplicate Key 指定列进行排序。这些排序键就像是书架上排列整齐的书籍类别标签,而前缀索引则是在这些排序键基础上建立的稀疏索引。

想象一下,每 1024 行数据组成一个逻辑数据块,就像一个书架分区。每个分区在前缀索引表中有一个索引项,这个索引项就像是分区的 “小目录”,其内容为该分区中第一行数据排序列组成的前缀,当查询涉及这些排序列时,系统可以通过这个小巧的 “目录” 快速定位到相关的数据块,就如同通过书架分区目录快速找到所需书籍类别,大大减少了搜索范围,从而加速查询。

注意⚠️Doris的前缀索引长度不超过 36 字节。

例如,当表的排序列为 user_id(8 Bytes)、age(4 Bytes)、message(VARCHAR (100))等,前缀索引可能为 user_id + age + message 的前 20 字节(若总长度未超 36 字节)。当查询条件为SELECT * FROM table WHERE user_id = 1829239 and age = 20;时,前缀索引能够快速定位到包含符合条件数据的逻辑数据块,查询效率远高于SELECT * FROM table WHERE age = 20;,因为后者无法有效利用前缀索引。

倒排索引:信息检索的 “关键词定位器”

从 2.0.0 版本起,Doris 引入了倒排索引这一强大工具,它在信息检索领域有着举足轻重的地位。在 Doris 的世界里,表的一行如同一份文档,一列则是文档中的一个字段。倒排索引就像是一个高效的 “关键词定位器”,将文本分解成一个个词,构建词到文档编号(即表中的行)的索引。

例如,对于一个包含用户评论的表,对评论列创建倒排索引后,当我们要查询包含特定关键词(如 “OLAP”)的评论时,倒排索引可以快速定位到包含该关键词的行。它不仅能加速字符串类型的全文检索,支持多种关键词匹配方式,如同时匹配多个关键字(MATCH_ALL)、匹配任意一个关键字(MATCH_ANY)、短语查询(MATCH_PHRASE)等,还能加速普通等值、范围查询,替代了之前的 BITMAP 索引功能。在存储上,倒排索引使用独立文件,与数据文件一一对应但物理分离,这使得创建和删除索引无需重写数据文件,大大降低了处理开销。

注意⚠️,存在精度问题的浮点数类型(FLOAT 和 DOUBLE)以及部分复杂数据类型(如 MAP、STRUCT 等部分类型)暂不支持倒排索引。

(二)跳数索引:智能跳过 “无关数据块”

ZoneMap 索引:数据块的 “统计侦探”

ZoneMap 索引如同一位默默工作的 “统计侦探”,自动维护每一列的统计信息。对于每一个数据文件(Segment)和数据块(Page),它都会记录下最大值、最小值以及是否有 NULL 值。当进行等值查询、范围查询或 IS NULL 查询时,它可以根据这些统计信息迅速判断该数据文件或数据块是否可能包含满足条件的数据。如果判断不包含,就像侦探排除一个无关线索一样,直接跳过该文件或数据块不读取,从而减少 I/O 操作,加速查询。

例如,在一个包含用户年龄的表中,当查询年龄在某个范围内的数据时,ZoneMap 索引可以通过数据块的年龄最大值和最小值,快速排除那些明显不满足条件的数据块,提高查询效率。

BloomFilter 索引:基于概率的 “快速筛子”

BloomFilter 索引是基于 BloomFilter 算法的一种跳数索引,它就像是一个高效的 “快速筛子”。BloomFilter 是一种空间效率高的概率型数据结构,由一个超长的二进制位数组和一系列哈希函数组成。在 Doris 中,BloomFilter 索引以数据块(page)为单位构建。写入数据时,数据块中的每个值经过哈希存入对应 BloomFilter;查询时,根据等值条件的值判断 BloomFilter 是否包含该值,若不包含则跳过对应数据块。

例如,在一个包含大量用户 ID 的表中,对用户 ID 列创建 BloomFilter 索引后,当查询特定用户 ID 时,如果 BloomFilter 判断该用户 ID 不在某个数据块对应的 BloomFilter 中,就可以直接跳过该数据块,无需读取,大大减少了 I/O。

注意⚠️:它只对 IN 和 = 的等值查询有效,且不支持 Tinyint、Float、Double 类型列,对低基数字段加速效果有限。

NGram BloomFilter 索引:文本 LIKE 查询的 “助力器”

NGram BloomFilter 索引专门为文本 LIKE 查询而生,是文本查询的 “助力器”。它与 BloomFilter 索引类似,但存入 BloomFilter 的不是原始文本值,而是对文本进行 NGram 分词后的每个词。对于 LIKE 查询,将 LIKE 的 pattern 也进行 NGram 分词,判断每个词是否在 BloomFilter 中,若某个词不在,则对应的数据块不满足 LIKE 条件,可跳过该数据块。

例如,在一个存储产品描述的表中,对描述列创建 NGram BloomFilter 索引后,当查询包含特定短语(如 “super awesome”)的产品描述时,它可以快速筛选出可能包含该短语的数据块,加速查询。但它只支持字符串列,且要求 LIKE pattern 中的连续字符个数大于等于索引定义的 NGram 中的 N。

二、索引特点详细对比

不同类型的索引各有千秋,也存在一定局限,让我们通过表格直观对比一下:

类型索引优点局限
点查索引前缀索引内置索引,性能最好一个表只有一组前缀索引
点查索引倒排索引支持分词和关键词匹配,任意列可建索引,多条件组合,持续增加函数加速索引存储空间较大,与原始数据相当
跳数索引ZoneMap 索引内置索引,索引存储空间小支持的查询类型少,只支持等于、范围
跳数索引BloomFilter 索引比 ZoneMap 更精细,索引空间中等支持的查询类型少,只支持等于
跳数索引NGram BloomFilter 索引支持 LIKE 加速,索引空间中等支持的查询类型少,只支持 LIKE 加速

三、索引加速的运算符和函数列表

了解索引对不同运算符和函数的支持,有助于我们在查询中更好地利用索引加速:

运算符 / 函数前缀索引倒排索引ZoneMap 索引BloomFilter 索引NGram BloomFilter 索引
=YESYESYESYESNO
!=YESYESNONONO
INYESYESYESYESNO
NOT INYESYESNONONO
>, >=, <, <=, BETWEENYESYESYESNONO
IS NULLYESYESYESNONO
IS NOT NULLYESYESNONONO
LIKENONONONOYES
MATCH, MATCH_*NOYESNONONO
array_containsNOYESNONONO
array_overlapsNOYESNONONO
is_ip_address_in_rangeNOYESNONONO

四、索引使用指南

(一)前缀索引选择建议

选择最频繁过滤字段:因为一个表只有一组前缀索引,所以要将查询中最常用于 WHERE 过滤条件的字段作为 Key。例如,在一个用户行为分析表中,如果经常根据用户 ID 进行查询,那么将用户 ID 作为前缀索引的 Key 列是明智之举。

字段顺序很关键:越常用的字段越放在前面,因为前缀索引只对 WHERE 条件中字段在 Key 的前缀中才有效。比如,查询条件经常是WHERE user_id = 123 AND age = 25,那么建表时将 user_id 放在前面作为排序列,能更好地利用前缀索引加速查询。

(二)其他索引选择建议

非 Key 字段过滤:对非 Key 字段如有过滤加速需求,首选建倒排索引,因其适用面广,可多条件组合。例如,在一个包含用户评论和评分的表中,若需要根据评论内容和评分范围同时进行查询过滤,倒排索引可以很好地满足需求。

字符串 LIKE 匹配:如果有字符串 LIKE 匹配需求,可再加一个 NGram BloomFilter 索引。比如在产品描述搜索场景中,使用 NGram BloomFilter 索引能有效加速 LIKE 查询。

索引存储空间敏感:当对索引存储空间很敏感时,可将倒排索引换成 BloomFilter 索引。例如,在一个存储海量低基数用户属性数据的表中,BloomFilter 索引在满足等值查询加速需求的同时,能减少存储空间占用。

(三)性能优化与分析

如果性能不及预期,可通过 QueryProfile 分析索引过滤掉的数据量和消耗的时间,具体参考各个索引的详细文档。例如,通过查看 RowsKeyRangeFiltered(前缀索引过滤掉的行数)、RowsInvertedIndexFiltered(倒排索引过滤掉的行数)等指标,评估索引的过滤效果,进而优化索引设计。

五、索引的管理与使用

(一)前缀索引

管理:前缀索引无需专门语法定义,建表时自动取表的 Key 的前 36 字节作为前缀索引。

使用:用于加速 WHERE 条件中的等值和范围查询,能加速时自动生效,无特殊语法。例如,SELECT * FROM table WHERE user_id = 123 AND age > 20;这样的查询,若 user_id 和 age 是排序列,前缀索引可自动发挥作用。

(二)倒排索引

管理

建表时定义:在建表语句中,在 COLUMN 定义之后进行索引定义,如CREATE TABLE table_name (column_name1 TYPE1, column_name2 TYPE2, INDEX idx_name1(column_name1) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment']);,需指定索引列名、索引类型(USING INVERTED),还可设置分词器等额外属性。

已有表增加:支持CREATE INDEXALTER TABLE ADD INDEX两种语法,新增索引定义后,新写入数据会生成倒排索引,存量数据需使用BUILD INDEX触发构建。例如,CREATE INDEX idx_name ON table_name(column_name) USING INVERTED;BUILD INDEX index_name ON table_name;

已有表删除:使用DROP INDEX idx_name ON table_name;ALTER TABLE table_name DROP INDEX idx_name;删除倒排索引。

使用

全文检索关键词匹配:通过MATCH_ANYMATCH_ALL等完成,如SELECT * FROM table_name WHERE column_name MATCH_ANY 'keyword1 ...';

全文检索短语匹配:通过MATCH_PHRASE完成,如SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2';,需注意设置support_phrase属性。

普通等值、范围、IN、NOT IN 查询:正常 SQL 语句即可,如SELECT * FROM table_name WHERE id = 123;。可通过 Query Profile 中的 RowsInvertedIndexFiltered、InvertedIndexFilterTime 等指标分析倒排索引的加速效果。

(三)BloomFilter 索引

管理

建表时创建:通过表的 PROPERTIES “bloom_filter_columns” 指定哪些字段建 BloomFilter 索引,如PROPERTIES ("bloom_filter_columns" = "column_name1,column_name2");

已有表增加、删除:通过 ALTER TABLE 修改表的 bloom_filter_columns 属性完成,如ALTER TABLE table_name SET ("bloom_filter_columns" = "column_name1,column_name2,column_name3");增加索引,ALTER TABLE table_name SET ("bloom_filter_columns" = "column_name2,column_name3");删除索引。

使用:用于加速 WHERE 条件中的等值查询,自动生效,无特殊语法。可通过 Query Profile 中的 RowsBloomFilterFiltered、BlockConditionsFilteredBloomFilterTime 等指标分析加速效果。

(四)NGram BloomFilter 索引

管理

创建:在建表语句中 COLUMN 定义之后定义索引,如INDEX idx_column_name (column_name) USING NGRAM_BF PROPERTIES("gram_size"="3", "bf_size"="1024") COMMENT 'username ngram_bf index',需指定索引列名、索引类型(USING NGRAM_BF)及分词相关属性。

查看:使用SHOW CREATE TABLE table_name;SHOW INDEX FROM idx_name;查看索引。

删除:使用ALTER TABLE table_ngrambf DROP INDEX idx_ngrambf;删除索引。

修改:使用CREATE INDEXALTER TABLE ADD INDEX语法修改索引定义。

使用:用于加速 LIKE 查询,如SELECT count() FROM table1 WHERE message LIKE '%error%';。可通过 Query Profile 中的 RowsBloomFilterFiltered、BlockConditionsFilteredBloomFilterTime 等指标分析加速效果。

六、总结

总之,Apache Doris 索引体系丰富强大,多种索引各有优势。前缀索引依排序结构定位数据,倒排索引助力全文检索,ZoneMap 索引借统计信息跳过无关数据块,BloomFilter 索引和 NGram BloomFilter 索引分别加速等值和文本 LIKE 查询。只要深入了解其原理、场景及使用方法,就能按需精准选择,让 Doris 在数据查询中性能全开,无论是海量数据点查还是复杂文本检索,都能轻松拿捏,实在搞不定,看看profile,索引生效了没,别做了和没做一样,就尬住了 。

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

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

相关文章

docker file中ADD命令的介绍

在 Docker 的世界里&#xff0c;Dockerfile 是一个用于定义镜像内容和行为的脚本文件。其中&#xff0c;ADD 指令是 Dockerfile 中一个非常重要的命令&#xff0c;用于将文件或目录从主机文件系统复制到容器的文件系统中。本文将详细介绍 ADD 指令的作用、使用方式以及一些最佳…

从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?

本文首发&#xff1a;从零到一&#xff1a;如何用阿里云百炼和火山引擎搭建专属 AI 助手&#xff08;DeepSeek&#xff09;&#xff1f; 阿里云百炼和火山引擎都推出了免费的 DeepSeek 模型体验额度&#xff0c;今天我和大家一起搭建一个本地的专属 AI 助手。  阿里云百炼为 …

cpp中的继承

一、继承概念 在cpp中&#xff0c;封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类&#xff08;也就是基类&#xff09;的基础上创建新类&#xff08;派生类或者子类&#xff09;&#xff0c;从而实现代码的复用。 如上图所示&#xff0c;Person是基类&…

【QT】QLinearGradient 线性渐变类简单使用教程

目录 0.简介 1&#xff09;qtDesigner中 2&#xff09;实际执行 1.功能详述 3.举一反三的样式 0.简介 QLinearGradient 是 Qt 框架中的一个类&#xff0c;用于定义线性渐变效果&#xff08;通过样式表设置&#xff09;。它可以用来填充形状、背景或其他图形元素&#xff0…

前端项目配置 Nginx 全攻略

在前端开发中&#xff0c;项目开发完成后&#xff0c;如何高效、稳定地将其部署到生产环境是至关重要的一步。Nginx 作为一款轻量级、高性能的 Web 服务器和反向代理服务器&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;成为了前端项目部署的首选方案。本文将详细介绍在…

网络安全学习-常见web漏洞的渗xxx透以及防护方法

渗XX透测试 弱口令漏洞 漏洞描述 目标网站管理入口&#xff08;或数据库等组件的外部连接&#xff09;使用了容易被猜测的简单字符口令、或者是默认系统账号口令。 渗XX透测试 如果不存在验证码&#xff0c;则直接使用相对应的弱口令字典使用burpsuite 进行爆破如果存在验证…

网络安全 机器学习算法 计算机网络安全机制

&#xff08;一&#xff09;网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型&#xff1a; 自主访问控制强制访问控制 访问控制措施&#xff1a; 入…

2025网络安全等级测评报告,信息安全风险评估报告(Word模板)

一、概述 1.1工作方法 1.2评估依据 1.3评估范围 1.4评估方法 1.5基本信息 二、资产分析 2.1 信息资产识别概述 2.2 信息资产识别 三、评估说明 3.1无线网络安全检查项目评估 3.2无线网络与系统安全评估 3.3 ip管理与补丁管理 3.4防火墙 四、威胁细类分析 4.1威胁…

Ubuntu22.04系统安装Anaconda、CUDA和CUDNN

之前一直在Windows系统下使用Anaconda和CUDA加速&#xff0c;最近需要复现一个算法&#xff0c;文档里面有Linux系统conda构建环境的教程。 本篇博文参考博文&#xff0c;记录自己安装的过程&#xff0c;便于以后需要。 目录 1.Anaconda1.1 安装包下载1.2 安装软件1.3 更新cond…

微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型

一、注册火山引擎账号&#xff0c;创建API Key和model&#xff08;接入点ID&#xff09; 1.注册并登陆火山引擎账号&#xff0c;网址为&#xff1a;https://console.volcengine.com/ 2.根据登陆后的页面提示进行实名认证&#xff0c;实名认证后才能创建API Keyt和创建接入点。…

蓝桥杯之日期题

文章目录 1.蓝桥杯必备知识点2. 题型13.需求2 1.蓝桥杯必备知识点 蓝桥杯是一个面向全国高校计算机相关专业学生的学科竞赛&#xff0c;涵盖多个赛道&#xff0c;常见的有软件类&#xff08;如 C/C 程序设计、Java 软件开发、Python 程序设计&#xff09;和电子类&#xff08;…

muduo网络库2

Muduo网络库&#xff1a;底层实质上为Linux的epoll pthread线程池&#xff0c;且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环&#xff0c;有一个main Reactor负载accept连接&#xff0c;然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)&…

WinSCP 连接到 Ubuntu 虚拟机

要使用 WinSCP 连接到 Ubuntu 虚拟机&#xff0c;一般采用 SFTP 或 SCP 协议进行文件传输。以下是详细步骤&#xff1a; 1. 确保虚拟机网络可访问 首先&#xff0c;你的 Ubuntu 虚拟机需要允许外部访问&#xff1a; 如果使用 NAT 网络&#xff1a;需要设置端口转发&#xff0…

redis小记

redis小记 下载redis sudo apt-get install redis-server redis基本命令 ubuntu16下的redis没有protected-mode属性&#xff0c;就算sudo启动&#xff0c;也不能往/var/spool/cron/crontabs写计划任务&#xff0c;感觉很安全 #连接到redis redis-cli -h 127.0.0.1 -p 6379 …

Docker核心概念

容器介绍 Docker 是世界领先的软件容器平台&#xff0c;所以想要搞懂 Docker 的概念我们必须先从容器开始说起。 什么是容器? 先来看看容器较为官方的解释 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量…

阿里云可观测全面拥抱 OpenTelemetry 社区

作者&#xff1a;古琦 在云计算、微服务、容器化等技术重塑 IT 架构的今天&#xff0c;系统复杂度呈指数级增长。在此背景下&#xff0c;开源可观测性技术已从辅助工具演变为现代 IT 系统的"数字神经系统"&#xff0c;为企业提供故障预警、性能优化和成本治理的全方…

2025年2月科技热点深度解析:AI竞赛、量子突破与开源革命

引言 2025年的科技领域持续呈现爆发式增长&#xff0c;AI大模型竞争白热化、量子计算商业化加速、开源工具生态繁荣成为本月最受关注的议题。本文结合最新行业动态&#xff0c;从技术突破、商业布局到开发者生态&#xff0c;全面解析当前科技热点&#xff0c;为读者提供深度洞…

idea创建第一个springboot程序

说明&#xff1a; 我计划用idea&#xff0c;创建第一个springboot程序&#xff0c;但是作为新手完全不会弄&#xff0c;今天我就亲自尝试一边&#xff0c;并且出一期详细&#xff0c;完美的教程&#xff0c;亲测可以运行 step1. 点击file &#xff0c; 选new&#xff0c; 选…

半导体芯片制造中 W CVD(钨化学气相沉积)

半导体芯片制造中 W CVD&#xff08;钨化学气相沉积&#xff09; 的 Nucleation 解析 在钨&#xff08;W&#xff09;化学气相沉积&#xff08;CVD&#xff09;工艺中&#xff0c;Nucleation&#xff08;成核&#xff09; 是沉积过程的初始阶段&#xff0c;指钨原子或分子在基…

Three.js 入门(辅助、位移、父子关系、缩放旋转、响应式布局)

本篇主要学习内容 : 三维坐标系与辅助坐标系物体位移与父子元素物体的缩放与物体的旋转设置响应式画布与全屏控制 点赞 关注 收藏 学会了 本文使用 Three.js 的版本&#xff1a;171 基于 Vue3vite开发调试 1.三维坐标系与辅助坐标系 1.1) 导入three和轨道控制器 // 导入…