Doris索引机制全解析,如何用高效索引加速数据分析

在当今大数据时代,企业对于实时数据分析的需求呈现爆发式增长。面对动辄PB级的数据量和秒级响应的业务诉求,传统数据库系统往往力不从心。Apache Doris作为新一代MPP分析型数据库,凭借其独特的索引机制,在京东、美团等企业的实时数仓场景中展现出卓越性能。本文将深入解析Doris索引设计的精妙之处。

与传统的OLTP数据库不同,Doris作为OLAP系统面临着完全不同的挑战:海量数据(单表千亿级)、复杂查询(多表Join+聚合)、实时响应(亚秒级延迟)。在这种场景下,Doris选择了多层次互补型索引体系,通过不同粒度的索引配合,在存储空间(仅增加5%-10%)和查询效率之间找到完美平衡点。

其核心设计原则可概括为:

  • 智能路由:通过元数据快速定位数据块
  • 分层过滤:从分区级到列级的递进式筛选
  • 计算下推:在存储层完成最大限度的过滤

Doris 索引分类

前缀稀疏索引

Apache Doris 数据库存储在类似 SSTable 的数据结构中,SSTable 是一种有序的数据结构,可以按照指定的一个或多个列进行排序存储。在查询时加上排序列,Doris 不需要扫描全表即可快速找到需要处理的数据,降低搜索复杂度。

除了排序健,Doris 还会每隔 1024 行数据创建一个稀疏前缀索引,索引中的 Key 是当前 1024 行中第一行中排序列的值。和传统数据库的单列或多列索引不同,Doris 将表数据的前序列字段组成前缀索引,最大长度不超过 36 字节。比如在以下的表结构中,前缀索引中保存的数据为:user_id(8 Bytes) + age(4 Bytes) + message(prefix 20 Bytes)。

ColumnNameType
user_idBIGINT
ageINT
messageVARCHAR(100)
max_dwell_timeDATETIME
min_dwell_timeDATETIME

这里需要注意的是,前缀索引遇到 VARCHAR 类型会自动截断,即使没有达到 36 个字节。所以在设计前缀索引时,如果不是特别需求,不建议将 VARCHAR 字段放在最前面。

在查找前缀索引表时可以通过索引确定该行数据所在的逻辑数据块的起始行号,由于前缀索引比较小,可以全量缓存在内存中,快速定位数据块,提升查询效率。

倒排索引

倒排索引将文本分成一个个词,构建词->文档编号的索引,Table 的一行对应一个文档、一列对应文档中的一个字段。对创建了倒排索引的列,建立每个值到对应行号集合的倒排表。

倒排索引的使用范围很广泛,可以加速等值、范围、全文检索等多种类型的操作。一个表可以有多个倒排索引,查询时多个倒排索引的条件可以任意组合。对于等值查询,先从倒排表中查到行号集合,然后直接读取对应行的数据,而不用逐行扫描匹配数据,从而减少 I/O 加速查询。

创建倒排索引时可以通过 PROPERTIES 参数指定分词器和分词模式,满足更加个性化的需求。

BloomFileter 索引

BloomFilter 索引是基于 BloomFilter 的一种跳数索引,原理是利用 BloomFilter 跳过等值查询指定条件不满足的数据块,达到减少 I/O、加速查询的目的。通常应用在一些需要快速判断某个元素是否属于集合,但并不严格要求 100%正确的场合。

BloomFilter 是由 Bloom 在 1970 年提出的一种多哈希函数映射的快速查找算法,由一个超长的二进制位数组和一系列的哈希函数组成。二进制位数组初始全部为 0,当给定一个待查询的元素时,这个元素会被一系列哈希函数计算映射出一系列的值,所有的值在位数组的偏移量处置为 1。
在这里插入图片描述

Doris BloomFilter 索引以数据块(page)为单位构建,每个数据块存储一个 BloomFilter。写入时,对于数据块中的每个值,经过 Hash 存入数据块对应的 BloomFilter。查询时,根据等值条件的值,判断每个数据块对应的 BloomFilter 是否包含这个值,不包含则跳过对应的数据块不读取,达到减少 I/O 查询加速的目的。

ZoneMap 索引

ZoneMap 索引自动维护每一列的统计信息,为每一个数据文件和数据块记录最大值、最小值以及是否包含 NULL 值。对于等值查询、范围查询、IS NULL,可以通过最大值、最小值、是否有 NULL 来判断数据文件和数据块是否可以包含满足条件的数据,如果没有则跳过不读对应的文件或数据块减少 I/O 加速查询。

前缀索引和 ZoneMap 索引是 Apache Doris 自动维护的内建智能索引,无需用户管理。

索引特性总结

最后为了大家学习的方便,将各种索引的优缺点汇总如下。

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

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

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

相关文章

基于SpringBoot + Vue 的作业管理系统

产品包含: 项目源码数据库文件论文ppt 技术栈 架构: B/S、MVC 系统环境:Windows/Mac 开发环境:IDEA、JDK1.8、Maven、Mysql 技术栈:Java、Mysql、SpringBoot、Mybatis、Vue 功能模块 用户模块:学生用户、管理员、…

HCL(HashiCorp Configuration Language)是一种结构化配置语言

HCL(HashiCorp Configuration Language)是一种结构化配置语言,语法简洁且可读性强,广泛用于 Docker Buildx Bake、Terraform、Nomad 等工具的配置。以下是其核心语法规则和示例: 1. 基础结构 HCL 使用 块(…

《AI大模型应知应会100篇》第50篇:大模型应用的持续集成与部署(CI/CD)实践

第50篇:大模型应用的持续集成与部署(CI/CD)实践 🧾 摘要 在AI大模型开发中,随着模型版本迭代频繁、依赖复杂、部署环境多样,构建一套高效可靠的持续集成与持续交付(CI/CD)流程显得尤…

【Linux深入浅出】之全连接队列及抓包介绍

【Linux深入浅出】之全连接队列及抓包介绍 理解listen系统调用函数的第二个参数简单实验实验目的实验设备实验代码实验现象 全连接队列简单理解什么是全连接队列全连接队列的大小 从Linux内核的角度理解虚拟文件、sock、网络三方的关系回顾虚拟文件部分的知识struct socket结构…

DB-GPT V0.7.1 版本更新:支持多模态模型、支持 Qwen3 系列,GLM4 系列模型 、支持Oracle数据库等

V0.7.1版本主要新增、增强了以下核心特性 🍀DB-GPT支持多模态模型。 🍀DB-GPT支持 Qwen3 系列,GLM4 系列模型。 🍀 MCP支持 SSE 权限认证和 SSL/TLS 安全通信。 🍀 支持Oracle数据库。 🍀 支持 Infini…

2025五一数学建模竞赛A题完整分析论文(共45页)(含模型、可运行代码、数据)

2025年五一数学建模竞赛A题完整分析论文 摘 要 一、问题分析 二、问题重述 三、模型假设 四、符号定义 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1参考代码 5.1.4问题1求解结果 5.2问题2 5.2.1问题2思路分析 …

[学习]RTKLib详解:pntpos.c与postpos.c

文章目录 RTKLib详解:pntpos.c与postpos.cPart A: pntpos.c一、概述二、整体工作流程三、主要函数说明1. pntpos()2. satposs()3. estpos()4. rescode()5. prange()6. ionocorr()7. tropcorr()8. valsol()9. raim_fde()10. estvel() 四、函数调用关系图(…

【科研绘图系列】R语言绘制世界地图(map plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出图片系统信息介绍 【科研绘图系列】R语言绘制世界地图(map plot) 加载R包 library(ggmap) library(RColorBrewer) library(pals) …

在pycharm profession 2020.3上安装使用xlwings

之前写了一篇文章在win7和python3.8上安装xlwings-CSDN博客 今天安装了pycharm profession 2020.3,自带Terminal,所以试一下安装xlwings。 一、新建一个python项目 二、安装xlwings 三、输入安装命令 pip3.exe install -i https://pypi.tuna.tsinghu…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.3 数据脱敏与安全(模糊处理/掩码技术)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据脱敏实战:从模糊处理到动态掩码的全流程解析4.3 数据脱敏与安全:模糊处理与掩码技术深度实践4.3.1 数据脱敏的核心技术体系4.3.1.1 技…

坚鹏:平安保险集团《保险行业发展趋势与AI应用方法及案例》培训

坚鹏:平安保险集团《保险行业发展趋势与AI应用方法及案例》培训圆满成功 中国平安保险(集团)股份有限公司是全球领先的综合金融生活服务集团,2024年位列《财富》世界500强第16位,连续多年蝉联全球保险品牌价值榜首。截…

NetSuite 2025.1 学习笔记

目录 领域、新功能统计表 值得注意功能摘要 最有价值功能详解 1. 领域、新功能统计表 2. 值得注意功能 3. 最有价值功能 3.1 Customer 360 目前的Customer 360在加入了几个新的控件后,变得完整了,相比较过去,真正有了实用感。 3.2 CSV Im…

Messenger.Default.Send 所有重载参数说明

Messenger.Default.Send 是 MVVM 框架中实现消息传递的核心方法,其重载参数主要用于控制消息的发送范围和接收条件。以下是其所有重载形式及参数说明: ‌1. 基本消息发送‌ Send<TMessage>(TMessage message) ‌参数说明‌: TMessage:消息类型(泛型参数),可以是任…

代码异味(Code Smell)识别与重构指南

1、引言:什么是“代码异味”? 在软件开发中,“代码异味(Code Smell)”是指那些虽然不会导致程序编译失败或运行错误,但暗示着潜在设计缺陷或可维护性问题的代码结构。它们是代码演进过程中的“信号灯”,提示我们某段代码可能需要优化。 1.1 ✅ 为什么关注代码异味? 预…

K8S有状态服务部署(MySQL、Redis、ES、RabbitMQ、Nacos、ZipKin、Sentinel)

K8S部署MySQL ①、创建配置 ②、创建存储卷 ③、创建服务 指定配置文件 指定存储卷 ④、同样的方式创建mysql-slaver服务&#xff08;配置文件和mysql-master不同&#xff09; ⑤、进行主从同步关联 进入master服务中 进入从库的终端 K8S部署Redis…

正则表达式与文本三剑客grep、sed、awk

目录 一、正则表达式 1.1、字符匹配 1.2、次数匹配 1.3、位置锚定 1.4、分组或其他 二、扩展正则表达式 三、grep 四、awk 4.1、常用命令选项 4.2、工作原理 4.3、基础用法 4.4、内置变量 4.5、模式 4.6、条件判断 4.7、awk中的循环语句 4.8、数组 4.9、脚本 …

Matlab/Simulink的一些功能用法笔记(4)

水一篇帖子 01--MATLAB工作区的保护眼睛颜色设置 默认的工作区颜色为白色 在网上可以搜索一些保护眼睛的RGB颜色参数设置 在MATLAB中按如下设置&#xff1a; ①点击预设 ②点击颜色&#xff0c;点击背景色的三角标符号 ③点击更多颜色&#xff0c;找到RGB选项 ④填写颜色参数…

Qt国际化实战--精通Qt Linguist工具链

概述 在全球化的今天,软件产品需要支持多种语言和地区,以满足来自世界各地用户的需求。Qt框架提供了一套完整的工具集来帮助开发者实现应用程序的国际化(i18n)和本地化(l10n),其中最核心的就是Qt Linguist工具链 关于国际化与本地化 国际化(i18n): 指的是设计和开发…

0基础 | STM32 | STM32F103C8T6开发板 | 项目开发

注&#xff1a;本专题系列基于该开发板进行&#xff0c;会分享源代码 F103C8T6核心板链接&#xff1a; https://pan.baidu.com/s/1EJOlrTcProNQQhdTT_ayUQ 提取码&#xff1a;8c1w 图 STM32F103C8T6开发板 1、黑色制版工艺、漂亮、高品质 2、入门级配置STM32芯片(SEM32F103…

【SF顺丰】顺丰开放平台API对接(注册、API测试篇)

1.注册开发者账号 注册地址&#xff1a;顺丰企业账户中心 2.登录开发平台 登录地址&#xff1a;顺丰开放平台 3.开发者对接 点击开发者对接 4.创建开发对接应用 开发者应用中“新建应用”创建应用&#xff0c;最多创建应用限制数量5个 注意&#xff1a;需要先复制保存生产校验…