金仓数据库KingbaseES GIN 索引

news2024/10/7 8:24:31

目录

一、索引的逻辑结构

二、索引的物理结构

 三、GIN索引使用例子

1、前后模糊查询

2、全文检索

四、gin 索引可用于超长的字段


GIN(Generalized Inverted Index, 通用倒排索引) 是一个存储对(key, posting list)集合的索引结构,其中key是一个键值,而posting list 是一组出现过key的位置。如(‘hello', '14:2 23:4')中,表示hello在14:2和23:4这两个元祖出现过,在KingbaseES中这些位置实际上就是元组的tid(行号,包括数据块ID(32bit),以及item point(16 bit) )。

对于表中的每一个属性,在建立对应 gin 索引时,都可能会被解析为多个键值,所以同一个元组的tid可能会出现在多个key的posting list中。

一、索引的逻辑结构

GIN索引在逻辑上可以看成一个relation,该relation有两种结构:

1. 只索引基表的一列的情况:

keyvalue
Key1Posting list( or posting tree)
Key2Posting list( or posting tree)

2. 索引基表的多列(复合、多列索引):

column_idkeyvalue
Column1 numKey1Posting list( or posting tree)
Column2 numKey1Posting list( or posting tree)
Column3 numKey1Posting list( or posting tree)
.........

这种结构,对于基表中不同列的相同的key,在GIN索引中也会当作不同的key来处理。

二、索引的物理结构

GIN索引在物理存储上包含如下内容:
1. Entry:GIN索引中的一个元素,可以认为是一个词位,也可以理解为一个key
2. Entry tree:在Entry上构建的B树
3. posting list:一个Entry出现的物理位置(heap ctid, 堆表行号)的链表
4. posting tree:在一个Entry出现的物理位置链表(heap ctid, 堆表行号)上构建的B树,所以posting tree的KEY是ctid,而entry tree的KEY是被索引的列的值
5. pending list:索引元组的临时存储链表,用于fastupdate模式的插入操作

具体结构如下:

索引实际例子如下:

 三、GIN索引使用例子

1、前后模糊查询

创建测试数据:

test=# create extension sys_trgm;
CREATE EXTENSION
test=# create table t1_text(doc text);
CREATE TABLE

test=# insert into t1_text select short_desc from sys_settings;
INSERT 0 410

test=# create index ind_t1_text on t1_text using gin(doc gin_trgm_ops);
CREATE INDEX

查看执行计划:

test=# explain select * from t1_text where doc like '%mod%';         
                                QUERY PLAN                                
---------------------------------------------------------------------------
 Bitmap Heap Scan on t1_text  (cost=12.06..17.16 rows=8 width=55)
   Recheck Cond: (doc ~~ '%mod%'::text)
   ->  Bitmap Index Scan on ind_t1_text  (cost=0.00..12.06 rows=8 width=0)
         Index Cond: (doc ~~ '%mod%'::text)
(4 rows)

结论:可以看到,GIN 索引支持前后模糊查询。

注意:要使用gin索引,必须至少要有三个字符,如以上例子 mod 是三个字符。

2、全文检索

GIN 索引实际上更多的用于全文检索的情景。

准备数据:

alter table t1_text add (doc_ts tsvector);
update t1_text set doc_ts=to_tsvector(doc);
create index ind_t1_ts on t1_text using gin(doc_ts);

查看执行结果:

test=# explain select * from t1_text where doc_ts @@ to_tsquery('command');
                               QUERY PLAN                              
------------------------------------------------------------------------
 Bitmap Heap Scan on t1_text  (cost=8.32..25.71 rows=9 width=179)
   Recheck Cond: (doc_ts @@ to_tsquery('command'::text))
   ->  Bitmap Index Scan on ind_t1_ts  (cost=0.00..8.32 rows=9 width=0)
         Index Cond: (doc_ts @@ to_tsquery('command'::text))
(4 rows)
test=# select doc from t1_text where doc_ts @@ to_tsquery('command');
                                    doc                                   
---------------------------------------------------------------------------
 Sets the shell command that will be executed at every restart point.
 Sets the shell command that will be called to archive a WAL file.
 Allows archiving of WAL files using archive_command.
 Logs each replication command.
 Sets the shell command that will be executed once at the end of recovery.
 Sets the shell command that will retrieve an archived WAL file.
 Command to obtain passphrases for SSL.
 Also use ssl_passphrase_command during server reload.
 Updates the process title to show the active SQL command.
(9 rows)
test=#  select doc from t1_text where doc_ts @@ to_tsquery('comman');
 doc
-----
(0 rows)

四、gin 索引可用于超长的字段

test=# create table tab1(id1 text,id2 text );             
CREATE TABLE
test=# alter table tab1 alter column id2 set storage external;                      
ALTER TABLE<br>
test=# insert into tab1 select *,repeat(id1,10000) from generate_series(1,10000) id1;
INSERT 0 10000<br>
test=# create index ind_tab1 on tab1(id2);                                          
ERROR:  index row requires 10016 bytes, maximum size is 8191<br>
test=# create index ind_tab1 on tab1 using gin(id2 gin_trgm_ops);
CREATE INDEX

gin 索引之所以支持超长数据,这是因为gin 索引的 key 是关键词位,而非整条记录。

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

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

相关文章

【uniapp】利用Vuex实现购物车功能

实战项目名称&#xff1a;实现购物车功能 文章目录一、实战步骤1. 先编辑store.js文件2. 定义方法和基本的结构3. 编写SETSHPPING二、在项目中调用1. 触发相应的mutations2. 利用computed计算数量和总价的方法提示&#xff1a;本实战内容大部分为具体实现的思路&#xff0c;界面…

C语言 2 —— 常量

常量是什么&#xff1f; 常量就是在程序运行过程中&#xff0c;值不会发生改变&#xff0c;而且一眼可以辨识出值的量。 如&#xff1a; 20&#xff0c;‘a’ , 3.1415926 , "helloworld" 常量的分类&#xff1a; 整形&#xff0c;浮点型&#xff0c;字符型&#…

成电860考研专业课考前划重点-学长课程音频转文字-用科大讯飞花钱买的-三万五千字

成电860考研专业课考前划重点-学长课程音频转文字。 这个是我2021年把视频的音频扒下来后用科大讯飞音频转文字网站上花了几十块钱买的。 说话人1 03:04 对有回放&#xff0c;我这边开回放了&#xff0c;大家可以让大家下载&#xff0c;然后我怕这边回放有问题&#xff0c;大家…

Airtest poco 入门小结

目录 一、poco介绍 1、poco能做什么 2、三种定位方式 1&#xff09;基本选择器 2&#xff09;相对选择器 3&#xff09;空间顺序选择器 4&#xff09;正则表达式方式 3、poco支持平台 二、Airtest介绍 1、Airtest能做什么 2、Airtest不能做什么 3、Airtest的图像识别…

发挥数字化平台优势,电子元器件采购商城系统助力企业改变固有低效流程

我国是全球最大的电子元器件生产国&#xff0c;电子元器件在国民经济发展中占据着重要地位。近年来&#xff0c;随着数字经济的快速发展&#xff0c;电子元器件的需求量也在不断升高&#xff0c;但疫情与国际环境对电子元器件产业要素流通仍然造成了一定困扰。在此背景下&#…

win10系统下使用onnxruntime部署yolov5模型

文章目录前言一、环境1、硬件2、软件二、YOLO模型三、新建Qt项目1、pro文件2、mainwindow.h3、mainwindow.cpp四、YOLO 类封装1、yolov5.h2、yolov5.cpp3、class.names五、效果前言 上一篇介绍过使用opencv-dnn模块实现模型推理部署&#xff0c;但视频效果较差&#xff0c;本篇…

ps2023最新版免费滤镜插件Exposure安装下载教程

滤镜插件是ps的重要功能之一&#xff0c;它主要是用来制作不同的图片特效。那么&#xff0c;ps滤镜插件哪些好用&#xff0c;ps滤镜插件如何获取&#xff0c;下面我们一起来学习这些内容。 ps滤镜插件是比较多的&#xff0c;下面对几款常见的ps滤镜插件进行讲解&#xff0c;看…

TIA博途中的TRACE功能具体使用方法示例

TIA博途中的TRACE功能具体使用方法示例 我们可以利用TRACE曲线来监控程序、排查故障,那么具体怎样使用呢,可以参考以下内容。 如下图所示,打开TIA博途,新建项目后,在左侧项目树中可以看到TRACES, 如下图所示,双击添加新轨迹,然后在右侧窗口中,添加需要监视的信号,…

TOUGH2系列建模方法及在CO2地质封存、水文地球化学、地热、地下水污染等领域中的技术

TOUGH2系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同EOS模块&#xff0c;软件…

【矩阵论】3. 矩阵函数——矩阵函数求导

3.6 矩阵函数求导 3.6.1 积分与求导定义 设 mnm\times nmn 阶矩阵 A(x)(aij(x))mnA(x)\left(a_{ij}(x)\right)_{m\times n}A(x)(aij​(x))mn​ 中的元素都是 x 的可导函数&#xff0c;则 A(x)A(x)A(x) 为关于 xxx 的求导为&#xff1a; A′(A)dA(x)dx(daij(x)dx)mnA(A)\frac{…

正点原子stm32F407学习笔记5——串口通信实验

一、串口通信实验1 上位机给开发板发送数据&#xff0c;开发板将收到的数据发回给上位机 串口设置的一般步骤可以总结为如下几个步骤&#xff1a; 串口时钟使能&#xff0c;GPIO 时钟使能。设置引脚复用器映射&#xff1a;调用 GPIO_PinAFConfig 函数。GPIO 初始化设置&#…

数据库性能翻3倍:Redis on Flash分层存储技术是如何做到的?

Redis on flash简介&#xff1a;Redis on Flash 涉及到的是Redis的分层存储技术&#xff0c;即将数据存放在不同地方。Redis自2016年以来支持Redis on Flash。从2019年开始, Redis企业版&#xff08;Redis Enterprise&#xff09;宣布支持英特尔Optane DC持久性内存&#xff0c…

基于NB-IoT的智能垃圾桶系统设计与实现

本设计是基于物联网的智能垃圾桶&#xff0c;主要实现以下功能&#xff1a; 1&#xff0c;压力传感器模块采集垃圾重量数据&#xff1b; 2&#xff0c;GPS定位模块采集垃圾桶所在的经纬度数据&#xff1b; 3&#xff0c;人体红外模块检测人体并返回是否有人通过的数据&#xf…

会议管理系统SSM记录(二)

目录&#xff1a; &#xff08;1&#xff09;整合Freemarker &#xff08;2&#xff09;用户登录 &#xff08;3&#xff09;提取头部 &#xff08;4&#xff09;提取菜单抽取 &#xff08;1&#xff09;整合Freemarker 在pom.xml中加入Freemark依赖&#xff1a; 创建free…

HTML+CSS大作业:基于HMTL校园学校网页设计题材【我的学校网站】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

专精特新企业三个层级

专精特新企业也是分层级的。工信部2022年6月印发《优质中小企业梯度培育管理暂行办法》里面明确提出中小企业培育的3个梯度&#xff0c;分别是创新型中小企业、专精特新中小企业和专精特新小巨人企业&#xff0c;刚好构成中小企业发展层级金字塔。这就意味着企业想要发展崛起&a…

19 04-读取DTC快照信息

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;19服务作为UDS中子功能最多的服务&#xff0c;一共有28种子功能&#xff0c;本文将介绍常用的19 04服务&#xff1a;读取快照信息。 关联文章&#xff1a; 19服务List 19 01-通过状态掩码读取DTC数目 $19服务:DTC…

1.2 C++编译器对指针的解释方式(深度理解c++指针)

1.2 指针 1.2.1 指针解释方式 从内存的角度&#xff0c;一个指向类对象的指针与一个指向整数类型的指针或一个指向数组的指针&#xff0c;三者之间是没有任何区别的&#xff0c;它们内部都只存储了一个机器地址值(word)。不同类型指针的区别仅在于其寻址出来的object类型的不…

div+css布局实现个人网页设计(HTML期末作业)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Spring源码深度解析:七、bean的加载① - doGetBean概述

我们先通过getBean()流程图&#xff0c;来了解Spring的getBean()方法的工作流程&#xff0c;接着根据这个工作流程一步一步的阅读源码 一、前言 文章目录&#xff1a;Spring源码分析&#xff1a;文章目录 getBean()方法是spring ioc的核心&#xff0c;阅读getBean()方法的源…