Doris索引小总结

在Doris中,添加索引是提升查询性能的重要手段。Doris支持两种类型的索引:内置智能索引和用户创建的二级索引。以下是关于如何在Doris中添加索引的详细步骤和注意事项:

内置智能索引

  1. 前缀索引
    • 基于排序键以有序的方式存储数据,为每1024行数据创建一个前缀索引。
    • 索引中的键是当前1024行组的第一行中已排序列的值。
    • 查询时,通过前缀索引可以快速定位到相关的1024行组,并从那里开始扫描。
    • 特别注意:Doris只有前36个字节能走前缀索引。因此,在创建表时,需要手动指定key,并且索引字段的类型和长度要尽可能精确,以增大索引范围。
  2. ZoneMap索引
    • 在列存格式上,对每一列自动维护的索引信息,包括Min/Max值、null值个数等。
    • 查询时,会根据范围条件过滤的字段按照ZoneMap统计信息选取扫描的数据范围。
    • ZoneMap索引对用户是透明的,无需额外操作。

用户创建的二级索引

  1. 倒排索引
    • 用于文本类型的全文检索和普通数值日期类型的等值范围查询。
    • 可以从海量数据中快速过滤出满足条件的行。
    • 不同数据模型下的创建规则:
      • Aggregate KEY表模型:只能为Key列建立倒排索引。
      • Unique KEY表模型:需要开启merge on write特性后,可以为任意列建立倒排索引。
      • Duplicate KEY表模型:可以为任意列建立倒排索引。
  2. BloomFilter索引
    • 一种高空间效率的概率数据结构,用于检查元素是否在集合中。
    • 适用于高基数(5000以上)列上的等值查询场景。
    • 创建方式:在表创建语句的PROPERTIES中添加"bloom_filter_columns"=“k1,k2,k3”,其中k1,k2,k3为要创建BloomFilter索引的关键列名称。
  3. NGram BloomFilter索引
    • 为了提升LIKE的查询性能。
    • 适用于亿级别以上数据,且只有模糊匹配需求时使用。
    • 只支持字符串列,且和BloomFilter索引为互斥关系,即同一个列只能设置两者中的一个。
  4. Bitmap索引
    • 能够应用在Duplicate、Unique数据模型的所有列和Aggregate模型的key列上。
    • 仅在Segment V2下生效,创建索引时表的存储格式将默认转换为V2格式。
    • 适用于低基数的列上(建议在100到100,000之间),如职业、地市等。
    • 特定类型的查询(如COUNT、OR、AND等逻辑操作)因为只需要进行位运算,所以更适合使用Bitmap索引。

添加索引

BloomFilter索引

(全版本适用)

  • 创建表时添加索引
PROPERTIES ("bloom_filter_columns"="saler_id,category_id")
  • 修改表时添加索引
ALTER TABLE ods_test_bloom_delta SET ("bloom_filter_columns" = "city_org_code");
  • 查看索引
SHOW CREATE TABLE example_db.example_bloom_index_tbl;
  • 删除索引
ALTER TABLE ods_test_bloom_delta SET ("bloom_filter_columns" = "");
  • BloomFilter索引的注意事项
    1. 适用场景
      BloomFilter索引适用于高基数列的等值查询场景,如用户ID、商品ID等。对于低基数列(如性别、状态等),由于每个数据块几乎都会包含所有取值,因此BloomFilter索引的加速效果有限。
    2. 数据类型限制
      目前Doris不支持对Tinyint、Float、Double类型的列创建BloomFilter索引。
    3. 性能权衡
      虽然BloomFilter索引能够提升查询性能,但也会增加写入和更新的开销。因此,在创建索引时需要权衡性能提升和存储开销之间的平衡。
    4. 查询优化
      在查询时,Doris会自动选择是否使用BloomFilter索引。如果希望查看某个查询是否命中了BloomFilter索引,可以通过查询的Profile信息来确认。
Bitmap索引

(该索引适用于1.2版本)

  • bitmap index:位图索引,是一种快速数据结构,能够加快查询速度
  • 创建索引:
CREATE INDEX [IF NOT EXISTS] index_name ON table1 (siteid) USING BITMAP COMMENT 'balabala';
  • 查看索引:
SHOW INDEX FROM example_db.table_name;
  • 删除索引:
DROP INDEX [IF EXISTS] index_name ON [db_name.]table_name;
倒排索引

(2.0版本以上适用)

  • 可用于进行文本类型的全文索引,以及普通数值日期类型的等值范围查询
  • 建表的时候建索引:
CREATE TABLE table_name
(column_name1 TYPE1,column_name2 TYPE2,column_name3 TYPE3,INDEX idx_name1(column_name1) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'],INDEX idx_name2(column_name2) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment']
)
table_properties;
  1. idx_column_name(column_name) 是必须的,column_name 是建索引的列名,必须是前面列定义中出现过的,idx_column_name 是索引名字,必须表级别唯一,建议命名规范:列名前面加前缀 idx_
  2. USING INVERTED 是必须的,用于指定索引类型是倒排索引
  3. PROPERTIES 是可选的,用于指定倒排索引的额外属性,目前支持的属性如下:
parser 指定分词器
  • 默认不指定代表不分词
  • english 是英文分词,适合被索引列是英文的情况,用空格和标点符号分词,性能高
  • chinese 是中文分词,适合被索引列主要是中文的情况,性能比 English 分词低
  • unicode 是多语言混合类型分词,适用于中英文混合、多语言混合的情况。它能够对邮箱前缀和后缀、IP 地址以及字符数字混合进行分词,并且可以对中文按字符分词。
parser_mode
  • 用于指定分词的模式,目前 parser = chinese 时支持如下几种模式:
  • fine_grained:细粒度模式,倾向于分出比较短、较多的词,比如 '武汉市长江大桥' 会分成 '武汉', '武汉市', '市长', '长江', '长江大桥', '大桥' 6 个词
  • coarse_grained:粗粒度模式,倾向于分出比较长、较少的词,,比如 '武汉市长江大桥' 会分成 '武汉市' '长江大桥' 2 个词
  • 默认 coarse_grained
support_phrase
  • 用于指定索引是否支持 MATCH_PHRASE 短语查询加速
  • true 为支持,但是索引需要更多的存储空间
  • false 为不支持,更省存储空间,可以用 MATCH_ALL 查询多个关键字
  • 默认 false

例如下面的例子指定中文分词,粗粒度模式,支持短语查询加速

INDEX idx_name(column_name) USING INVERTED PROPERTIES("parser" = "chinese", "parser_mode" = "coarse_grained", "support_phrase" = "true")
char_filter
  • 用于指定在分词前对文本进行预处理,通常用于影响分词行为
  • char_filter_type:指定使用不同功能的 char_filter(目前仅支持 char_replace)
  • char_replace 将 pattern 中每个 char 替换为一个 replacement 中的 char
  • char_filter_pattern:需要被替换掉的字符数
  • char_filter_replacement:替换后的字符数组,可以不用配置,默认为一个空格字符

例如下面的例子将点和下划线替换成空格,达到将点和下划线作为单词分隔符的目的,影响分词行为。

INDEX idx_name(column_name) USING INVERTED PROPERTIES("parser" = "unicode", "char_filter_type" = "char_replace", "char_filter_pattern" = "._", "char_filter_replacement" = " ")
ignore_above
  • 用于指定不分词字符串索引(没有指定parser)的长度限制
  • 长度超过 ignore_above 设置的字符串不会被索引。对于字符串数组,ignore_above 将分别应用于每个数组元素,长度超过 ignore_above 的字符串元素将不被索引。
  • 默认为 256,单位是字节
lower_case
  • 是否将分词进行小写转换,从而在匹配的时候实现忽略大小写
  • true: 转换小写
  • false:不转换小写
  • 从 2.1.2 版本开始默认为 true,自动转小写,之前的版本默认为 false
+ 添加倒排索引
-- 语法 1
CREATE INDEX idx_name ON table_name(column_name) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'];
-- 语法 2
ALTER TABLE table_name ADD INDEX idx_name(column_name) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'];
  • 构建倒排索引
-- 语法 1,默认给全表的所有分区 BUILD INDEX
BUILD INDEX index_name ON table_name;
-- 语法 2,可指定 Partition,可指定一个或多个
BUILD INDEX index_name ON table_name PARTITIONS(partition_name1, partition_name2);
  • 查看构建速度
SHOW BUILD INDEX [FROM db_name];
-- 示例 1,查看所有的 BUILD INDEX 任务进展
SHOW BUILD INDEX;
-- 示例 2,查看指定 table 的 BUILD INDEX 任务进展
SHOW BUILD INDEX where TableName = "table1";
  • 删除倒排索引
-- 语法 1
DROP INDEX idx_name ON table_name;
-- 语法 2
ALTER TABLE table_name DROP INDEX idx_name;
  • 加速查询的例子
-- 1. 全文检索关键词匹配,通过 MATCH_ANY MATCH_ALL 完成
SELECT * FROM table_name WHERE column_name MATCH_ANY | MATCH_ALL 'keyword1 ...';-- 1.1 content 列中包含 keyword1 的行
SELECT * FROM table_name WHERE content MATCH_ANY 'keyword1';-- 1.2 content 列中包含 keyword1 或者 keyword2 的行,后面还可以添加多个 keyword
SELECT * FROM table_name WHERE content MATCH_ANY 'keyword1 keyword2';-- 1.3 content 列中同时包含 keyword1 和 keyword2 的行,后面还可以添加多个 keyword
SELECT * FROM table_name WHERE content MATCH_ALL 'keyword1 keyword2';-- 2. 全文检索短语匹配,通过 MATCH_PHRASE 完成
-- 2.1 content 列中同时包含 keyword1 和 keyword2 的行,而且 keyword2 必须紧跟在 keyword1 后面
-- 'keyword1 keyword2','wordx keyword1 keyword2','wordx keyword1 keyword2 wordy' 能匹配,因为他们都包含keyword1 keyword2,而且keyword2 紧跟在 keyword1 后面
-- 'keyword1 wordx keyword2' 不能匹配,因为 keyword1 keyword2 之间隔了一个词 wordx
-- 'keyword2 keyword1',因为 keyword1 keyword2 的顺序反了
SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2';-- 2.2 content 列中同时包含 keyword1 和 keyword2 的行,而且 keyword1 keyword2 的 `词距`(slop) 不超过3
-- 'keyword1 keyword2', 'keyword1 a keyword2', 'keyword1 a b c keyword2' 都能匹配,因为keyword1 keyword2中间隔的词分别是0 1 3 都不超过3
-- 'keyword1 a b c d keyword2' 不能能匹配,因为keyword1 keyword2中间隔的词有4个,超过3
-- 'keyword2 keyword1', 'keyword2 a keyword1', 'keyword2 a b c keyword1' 也能匹配,因为指定 slop > 0 时不再要求keyword1 keyword2 的顺序。这个行为参考了 ES,与直觉的预期不一样,因此 Doris 提供了在 slop 后面指定正数符号(+)表示需要保持 keyword1 keyword2 的先后顺序
SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3';
-- slop 指定正号,'keyword1 a b c keyword2' 能匹配,而 'keyword2 a b c keyword1' 不能匹配
SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3+';-- 2.3 在保持词顺序的前提下,对最后一个词keyword2做前缀匹配,默认找50个前缀词(session变量inverted_index_max_expansions控制)
-- 'keyword1 keyword2abc' 能匹配,因为keyword1完全一样,最后一个 keyword2abc 是 keyword2 的前缀
-- 'keyword1 keyword2' 也能匹配,因为 keyword2 也是 keyword2 的前缀
-- 'keyword1 keyword3' 不能匹配,因为 keyword3 不是 keyword2 的前缀
-- 'keyword1 keyword3abc' 也不能匹配,因为 keyword3abc 也不是 keyword2 的前缀
SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1 keyword2';-- 2.4 如果只填一个词会退化为前缀查询,默认找50个前缀词(session变量inverted_index_max_expansions控制)
SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1';-- 2.5 对分词后的词进行正则匹配,默认匹配50个(session变量inverted_index_max_expansions控制)
-- 类似 MATCH_PHRASE_PREFIX 的匹配规则,只是前缀变成了正则
SELECT * FROM table_name WHERE content MATCH_REGEXP 'key*';-- 3. 普通等值、范围、IN、NOT IN,正常的 SQL 语句即可,例如
SELECT * FROM table_name WHERE id = 123;
SELECT * FROM table_name WHERE ts > '2023-01-01 00:00:00';
SELECT * FROM table_name WHERE op_type IN ('add', 'delete');

注意事项

  • 在创建索引时,需要根据实际的查询需求和数据特点来选择合适的索引类型。
  • 索引虽然可以提升查询性能,但也会增加写入和更新的开销。因此,需要在性能和写入效率之间做出权衡。
  • 定期监控索引的使用情况和性能表现,根据需要进行调整和优化。

总之,在Doris中添加索引是一个复杂但重要的过程,需要根据具体的场景和需求来选择合适的索引类型和创建方式。通过合理的索引设计,可以显著提升查询性能并优化数据库的整体表现。

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

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

相关文章

python爬虫入门教程

安装python 中文网 Python中文网 官网 安装好后打开命令行执行(如果没有勾选添加到Path则注意配置环境变量) python 出现如上界面则安装成功 设置环境变量 右键我的电脑->属性 设置下载依赖源 默认的是官网比较慢,可以设置为清华大…

数据结十大排序之(冒泡,快排,并归)

接上期: 数据结十大排序之(选排,希尔,插排,堆排)-CSDN博客 前言: 在计算机科学中,排序算法是最基础且最重要的算法之一。无论是大规模数据处理还是日常的小型程序开发,…

游戏引擎学习第54天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体,这些实体位于玩家的视野中,频繁更新,而那些离玩家较远的实体则以较低的频率运…

网络安全漏洞挖掘之漏洞SSRF

SSRF简介 SSRF(Server-Side Request Forgery:服务器端请求伪造是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外…

33. Three.js案例-创建带阴影的球体与平面

33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机(Finite State Machine, FSM)是一种用于建模系统行为的计算模型,它包含有限数量的状态,并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的,因此称…

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片

在计算机时代,我们依靠手机来捕捉和存储珍贵的回忆。但是,如果您不小心删除或丢失了手机上的照片怎么办?这真的很令人沮丧和烦恼,不是吗?好吧,如果您在 iPhone 上丢失了照片,您不必担心&#xf…

Linux高性能服务器编程 | 读书笔记 | 6. 高性能服务器程序框架

6. 高性能服务器程序框架 《Linux 高性能服务器编程》一书中,把这一章节作为全书的核心,同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后,正式进入了 Web 服务器项目的核心部分的学习 文章目录 6. 高性能服务器程序框架1.服…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

Xcode

info.plist Appearance Light 关闭黑暗模式 Bundle display name 设置app名称&#xff0c;默认为工程名 Location When In Use Usage Description 定位权限一共有3个key 1.Privacy - Location When In Use Usage Description 2.Privacy - Location Always and When In U…

C# 中的Task

文章目录 前言一、Task 的基本概念二、创建 Task使用异步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 关键字使用 Task.Wait 方法 四、处理 Task 的异常使用 try-catch 块使用 Task.Exception 属性 五、Task 的延续使用 ContinueWith 方法使用 await 关键字和异步方法…

【Java 学习】:内部类详解

详谈Java内部类 &#x1f4c3;&#x1f4c3;本文将通过Java内部类 是什么&#xff0c;为什么被广泛使用&#xff0c;以及又该如何去使用这三个方面来详细讲解其相关知识。 文章目录 1. 内部类是什么 2. 为什么要使用内部类 3. 如何使用内部类 &#x1f349;成员内部类 &…

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart

PyTorch3D 可视化

PyTorch3D是非常好用的3D工具库。但是PyTorch3D对于可用于debug&#xff08;例如调整cameras参数&#xff09;的可视化工具并没有进行系统的介绍。这篇文章主要是想介绍我觉得非常使用的PyTorch3D可视化工具。 1. 新建一个Mesh 从hugging face上下载一个glb文件&#xff0c;例…

RabbitMQ的核心组件有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ的核心组件有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理&#xff08;Messag…

SM4笔记整理

文章目录 1. 介绍2. 算法定义3. 迭代运算3.1 轮函数F3.2 合成置换T 4. SM4秘钥生成4.1 具体步骤4.2 系统参数FK4.2 固定参数CK 5. 参考资料 以下内容为信息安全开发过程中&#xff0c;SM4对称加密算法的笔记。 对称加密算法汇总介绍&#xff1a;对称加密算法和模式 1. 介绍 …

如何使用Git or SVN--可视化工具

不会吧 现在还有人不会Git可视化工具 &#xff0c;作为一个从命令行转为可视化的开发者&#xff0c;深知这个可视化工具的重要性&#xff0c;之前在命令行去维护我们的工程是一个很头疼的事情 &#xff0c;后面也就有了可视化工具&#xff0c;市面上的工具的教程都不是很详细哥…

基于Clinical BERT的医疗知识图谱自动化构建方法,双层对比框架

基于Clinical BERT的医疗知识图谱自动化构建方法&#xff0c;双层对比框架 论文大纲理解1. 确认目标2. 目标-手段分析3. 实现步骤4. 金手指分析 全流程核心模式核心模式提取压缩后的系统描述核心创新点 数据分析第一步&#xff1a;数据收集第二步&#xff1a;规律挖掘第三步&am…

《Time Ghost》的制作:使用 DOTS ECS 制作更为复杂的大型环境

*基于 Unity 6 引擎制作的 demo 《Time Ghost》 开始《Time Ghost》项目时的目标之一是提升在 Unity 中构建大型户外环境的构建标准。为了实现这一目标&#xff0c;我们要有处理更为复杂的场景的能力、有足够的工具支持&#xff0c;同时它对引擎的核心图形、光照、后处理、渲染…

华为大数据_unittest单元测试框架解析与应用

一、引言 随着软件开发的复杂度日益增加&#xff0c;单元测试在软件质量保证体系中扮演着越来越重要的角色。unittest作为Python的标准单元测试框架&#xff0c;以其简单、易用和强大的特性&#xff0c;受到了广大开发者的青睐。本文旨在深入解析unittest框架的核心原理&#…