doris索引

news2025/2/21 22:05:44

目前 Doris 主要支持两类索引:

- 内建的智能索引:包括前缀索引和 ZoneMap 索引。
- 用户创建的二级索引:包括 Bloom Filter 索引 和 Bitmap倒排索引。

其中 ZoneMap 索引是在列存格式上,对每一列自动维护的索引信息,包括 Min/Max,Null 值个数等等。这种索引对用户透明。

1 前缀索引

doris中,对于前缀索引有如下约束:

  1. 他的索引键最大长度是36个字节
  2. 当他遇到了varchar数据类型的时候,即使没有超过36个字节,也会自动截断

示例1:以下表中我们定义了: user_id,age,message作为表的key ;

在这里插入图片描述
doris为这个表创建前缀索引时,它生成的索引键如下:


user_id(8 Bytes) + age(4 Bytes) + message(prefix 24 Bytes)

示例2:以下表中我们定义了:age,user_name,message作为表的key

在这里插入图片描述
那么,doris为这个表创建前缀索引时,它生成的索引键如下:

age(4 Bytes) +user_name(20 Bytes)   指定key的时候

虽然还没有超过36个字节,但是已经遇到了一个varchar字段,它自动截断,不会再往后面取了

2 Bloom Filter 索引

1. Bloom Filter 本质上是一种位图结构,用于判断一个值是否存在
2. 会产生小概率的误判,因为hash算法天生的碰撞
3. 在doris中是以tablet为粒度创建的,给每一个tablet创建一个布隆过滤器索引

在这里插入图片描述
创建BloomFileter索引

  • 建表的时候指定
PROPERTIES (
"bloom_filter_columns"="name,age,uid"
)
  • alter修改表的时候指定
ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "k1,k3");

ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "k1,k4");


ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "");

建表示例:

CREATE TABLE IF NOT EXISTS sale_detail_bloom  (
    sale_date date NOT NULL COMMENT "销售时间",
    customer_id int NOT NULL COMMENT "客户编号",
    saler_id int NOT NULL COMMENT "销售员",
    sku_id int NOT NULL COMMENT "商品编号",
    category_id int NOT NULL COMMENT "商品分类",
    sale_count int NOT NULL COMMENT "销售数量",
    sale_price DECIMAL(12,2) NOT NULL COMMENT "单价",
    sale_amt DECIMAL(20,2)  COMMENT "销售总金额"
)
Duplicate  KEY(sale_date, customer_id,saler_id,sku_id,category_id)
PARTITION BY RANGE(sale_date)
(
PARTITION P_202111 VALUES [('2021-11-01'), ('2021-12-01'))
)
DISTRIBUTED BY HASH(saler_id) BUCKETS 1
PROPERTIES (
"replication_num" = "1",
"bloom_filter_columns"="saler_id,category_id",
"storage_medium" = "SSD"
);

查看BloomFilter索引

mysql> SHOW CREATE TABLE sale_detail_bloom \G;
*************************** 1. row ***************************
       Table: sale_detail_bloom
Create Table: CREATE TABLE `sale_detail_bloom` (
  `sale_date` date NOT NULL COMMENT "销售时间",
  `customer_id` int(11) NOT NULL COMMENT "客户编号",
  `saler_id` int(11) NOT NULL COMMENT "销售员",
  `sku_id` int(11) NOT NULL COMMENT "商品编号",
  `category_id` int(11) NOT NULL COMMENT "商品分类",
  `sale_count` int(11) NOT NULL COMMENT "销售数量",
  `sale_price` decimal(12, 2) NOT NULL COMMENT "单价",
  `sale_amt` decimal(20, 2) NULL COMMENT "销售总金额"
) ENGINE=OLAP
DUPLICATE KEY(`sale_date`, `customer_id`, `saler_id`, `sku_id`, `category_id`)
COMMENT "OLAP"
PARTITION BY RANGE(`sale_date`)
(PARTITION P_202111 VALUES [('2021-11-01'), ('2021-12-01')),
PARTITION P_202208 VALUES [('2022-08-01'), ('2022-09-01')),
PARTITION P_202209 VALUES [('2022-09-01'), ('2022-10-01')),
PARTITION P_202210 VALUES [('2022-10-01'), ('2022-11-01')))
DISTRIBUTED BY HASH(`saler_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"bloom_filter_columns" = "category_id, saler_id"
)
1 row in set (0.00 sec)

修改/删除BloomFilter索引

ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "customer_id,saler_id");

Doris BloomFilter适用场景
满足以下几个条件时可以考虑对某列建立Bloom Filter 索引:

  1. BloomFilter是在无法利用前缀索引的查询场景中,来加快查询速度的。
  2. 查询会根据该列高频过滤,而且查询条件大多是 in 和 = 过滤。
  3. 不同于Bitmap, BloomFilter适用于高基数列。比如UserID。因为如果创建在低基数的列上,比如 “性别” 列,则每个Block几乎都会包含所有取值,导致BloomFilter索引失去意义。字段随机

Doris BloomFilter使用注意事项
4. 不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引。
5. Bloom Filter索引只对 in 和 = 过滤查询有加速效果。
6. 可以通过explain来查看命中了哪种索引 --没办法查看

3 Bitmap 索引

用户可以通过创建bitmap index 加速查询
在这里插入图片描述
创建索引
在table1 上为siteid 创建bitmap 索引

CREATE INDEX [IF NOT EXISTS] index_name ON table1 (siteid) USING BITMAP COMMENT '这里是注释';

create index 索引名称  on 表名(给什么字段创建bitmap索引) using bitmap COMMENT '这里是注释'create index user_id_bitmap on sale_detail_bloom(sku_id) USING BITMAP COMMENT '这里是注释';

查看索引

SHOW INDEX FROM example_db.table_name;

删除索引

DROP INDEX [IF EXISTS] index_name ON [db_name.]table_name;

注意事项

  • bitmap 索引仅在单列上创建。
  • bitmap 索引能够应用在 Duplicate、Uniq 数据模型的所有列和 Aggregate模型的key列上。
  • bitmap 索引支持的数据类型如下:(老版本只支持bitmap类型)
    TINYINT,SMALLINT,INT,BIGINT,CHAR,VARCHAR,DATE,DATETIME,LARGEINT,DECIMAL,BOOL
  • bitmap索引仅在 Segment V2 下生效(Segment V2是升级版本的文件格式)。当创建 index 时,表的存储格式将默认转换为 V2 格式

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

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

相关文章

Go 语言实战案例:猜谜游戏在线词典SOCKS5代理服务器 Go学习路线

字节跳动后端入门 - Go 语言原理与实践& vscode配置安装Go 3.1猜谜游戏 3.1.2 生成随机数v2 package mainimport ("fmt""math/rand""time" )func main() {maxNum : 100rand.Seed(time.Now().UnixNano())secretNumber : rand.Intn(maxNum)fmt…

OS之页面置换算法

目录 一、最佳置换算法(OPT) 定义 案例 二、先进先出置换算法(FIFO) 定义 案例 FIFO特有的异常 三、最近最久未使用置换算法(LRU) 定义 案例 四、时钟置换算法(CLOCK) 定义 案例 五、改进型的时钟置换算法 定义 案例 一、最佳置换算法(OPT) 定义 每次选择淘汰…

GoWeb -- gin框架的入门和使用(2)

前言 书接上回,在gin的框架使用中,还有着许多方法以及它们的作用,本篇博客将会接着上次的内容继续记录本人在学习gin框架时的思路和笔记。 如果还没有看过上篇博客的可以点此跳转。 map参数 请求url: http://localhost:8080/us…

全志V3S嵌入式驱动开发(驱动开发准备)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 之前的文章都是教大家怎么搭建环境、看原理图、编译内核和根文件系统、做镜像,直到现在才进入驱动开发的主题。毕竟整个专栏的目的&…

Python 基础(十四):类和对象

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、面向对象编程二、创建类三、创建实例3.1、访问属性3.2、调用方法 四、属性默认值4…

网络通信协议-ICMP协议

目录 一、ICMP协议 二、ICMP协议通信过程 (1)机制 (2)原理 (3)相关术语 丢包率 网络延时率(延迟) 请求超时【类似表白对方压根不搭理你】 没有任何回复数据,回复…

DNS/ICMP协议/NAT技术

本博文分享DNS(简单认识)、ICMP(简单认识)和NAT技术(重点学习)。 DNS DNS是一整套从域名映射到IP的系统,TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆&…

windows下mysql中binlog日志分析和数据恢复

1.首先查看是否开启了binlog show variables like %log_bin%;看到了是没有开启的。 2.开启binlog日志,并重启mysql服务 不能通过命令的方式去打开,因为会提示说这个参数是只读的。如下图: 所以,打开mysql的配置文件&#xff…

Three.js--》实现3d地球模型展示

目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载地球模型 实现光柱效果 添加月球模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多…

配置MIT6.S081环境

配置环境 1实现环境2更换源3.安装RISC-V交叉编译工具4.安装QEMU5.检测安装6.下载源码7.检查调试工具8.安装vim9.进行初步调试 1实现环境 虚拟机(我用的VMware Workstation Pro)Ubantu20.04安装QEMU 注意必须使用ubuntu20.04版本,因为后面安装…

Webpack打包图片-JS-Vue

1 Webpack打包图片 2 Webpack打包JS代码 3 Babel和babel-loader 5 resolve模块解析 4 Webpack打包Vue webpack5打包 的过程: 在webpack的配置文件里面编写rules,type类型有多种,每个都有自己的作用,想要把小内存的图片转成bas…

华为OD机试之不含101的整数(Java源码)

不含101的数 题目描述 小明在学习二进制时,发现了一类不含 101的数,也就是: 将数字用二进制表示,不能出现 101 。 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个二进制不含 101 的整数? 输入描述…

WalkRE--刷图流程(超具体)

1、打开WalkRE软件,界面如下: 2、选择“根据模板新建工程”。操作如下: 3、导入数据。需要入准备好的dxf格式的CAD地形数据。操作如下: 在空白处右键,先关闭所有层(大部分层在刷图时用不上,仅打…

自动化测试2:selenium常用API

目录 1.webdirver API 1.1.定位元素 1.2CSS 1.语法 2,使用 1.3XPath定位 1.语法 2.使用 2.操作测试对象 2.1.鼠标点击与键盘输入 2.2submit 提交表单 2.3text 获取元素文本 3.添加等待 3.1.sleep休眠 3.2.智能等待 3.2.1.隐式等待 3.2.2显示等待 4.打印信息 …

web前端 --- CSS(04) -- 盒子模型、div+css网页布局、css3新特性

盒子模型 (1)网页标签分类: 行内元素:块级元素:有宽高,可以设置大小,同时不会让其他块元素默认占据当前行 (2)内边距: 内容和边线之间存在空白区域&#x…

路径规划算法:基于猫群优化的路径规划算法- 附代码

路径规划算法:基于猫群优化的路径规划算法- 附代码 文章目录 路径规划算法:基于猫群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法猫群…

数据库基础——3.SQL概述及规范

这篇文章我们来讲一下SQL概述和使用规范 目录 1.SQL概述 1.1SQL背景 1.2 SQL语言排行榜 1.3 SQL分类 2.SQL规则与规范 2.1基本规则 2.2 SQL大小写规范 (建议遵守) 2.3 注 释 2.4 命名规则(暂时了解) 2.5 数据导入指令 1…

【硬件】嵌入式电子设计基础之数字电路

数字电路与模拟电路的设计思想和应用方法有许多不同之处。 计算器是一个典型的由数字电路实现的电子设备,用户通过数字或符号摁键输入运算式,计算器经过运算之后把结果显示在屏幕上。现代数学电子学始于1946年,其标志是一台以电子管为核心器件…

奥地利博士联培申请签证经验(奥地利签证)

记录一下奥地利申请签证经验,供有需要的小伙伴借鉴: 我申请的是去克拉根福大学联合培养一年,正常的居留签证需要半年之久,但是如果有托管协议(Hosting Agreement)可以先申请D类签证,抵达奥地利再…

Shell脚本攻略:循环语句for

目录 一、理论 1.for循环 二、实验 1.实验一 2.实验二 3.实验三 4.实验四 5.实验五 6.实验六 7.实验七 一、理论 1.for循环 (1)for循环的常见三种用法 Ubuntu系统在6.10版本后默认使用dash环境; 而CentOS系统常见默认使用的是ba…