pgsql常用索引简写

文章来源:互联网博客文章,后续有时间再来细化整理。

在数据库查询中,合理的使用索引,可以极大提升数据库查询效率,充分利用系统资源。这个随着数据量的增加得到提升,越大越明显,也和业务线有关,越是读多写少的业务体现越明显。

索引优点:

  • 唯一索引保证唯一性
  • 加快数据的检索速度(单表查询、联合查询及分组排序等等)

索引缺点:

  • 创建索引和维护索引要耗费时间(创建、更新、删除都需要维护)
  • 索引需要占物理空间(物理空间包含内存和磁盘,这个看索引大小)

1 BTREE索引

CREATE INDEX默认使用BTREE索引,适合按照顺序存储的数据进行比较查询和范围查询。

查询优化器会优先考虑使用BTREE索引:

  • <,<=,=,>,>=
  • 以及这些操作的组合,比如between and,也可以使用BTREE。
  • 在索引列上的IS NULL 或者IS NOT NULL也可以使用BTREE。
  • BTREE索引也可以用于模糊查询,但是仅限字符串开头是常量的情况下,比如 name LIKE ‘Jason%’,或者name ~ ’^Jason’。但是name LIKE ‘%Jason’是不能用的。
  • Min/Max聚集操作也可使用BTREE索引。
  • 其实在merge join以及order by中,可以通过使用BTREE索引的有序性来减少sort带来的代价
create index on t1(id);

2 Hash索引

Hash索引是通过比较hash值来查找定位,如果hash索引列的数据重复度比较高,容易产生严重的hash冲突,从而降低查询效率,因此这种情况下,不适合hash索引。

CREATE INDEX idx_name ON table_name USING HASH (column_name);

3 GiST索引

不是独立的索引类型,是一种架构或者索引模板,是一棵平衡二叉树。适用于多维数据类型和集合数据类型。

适合业务:

  • 几何类型,支持位置搜索(包含、相交、在上下左右等),按距离排序。
  • 范围类型,支持位置搜索(包含、相交、在左右等)。
  • IP类型,支持位置搜索(包含、相交、在左右等)。
  • 空间类型(PostGIS),支持位置搜索(包含、相交、在上下左右等),按距离排序。
  • 标量类型,支持按距离排序。

相比Btree缺点:

  • GiST跟Btree索引相比,索引创建耗时较长,占用空间也比较大。

相比Btree有点:

  • BTREE组合索引(a, b),如果where条件中只有b,则无法使用索引。此时,GiST可以解决这种情况。
create index idx_t3_gist on t3 using gist(a,b);

条件分析: 


root=# explain select * from t3 where b = '2022-11-18 17:50:29.245683';QUERY PLAN
-------------------------------------------------------------------------------Index Scan using idx_t3_gist on t3  (cost=0.28..8.30 rows=1 width=49)Index Cond: (b = '2022-11-18 17:50:29.245683'::timestamp without time zone)
(2 rows)

4 SP-GiST索引

和GiST类似,但是是一棵不平衡树,支持多维和海量数据,把空间分割成互不相交的部分。SP-GiST适用于空间可以递归分割成不相交区域的结构,包括四叉树、k-D树和基数树。

create index on sites using spgist(url);

5 GIN索引

gin是倒排索引(es中字段默认会创建一个倒排索引),是一个存储对(key,list[])集合的索引结构,其中key是一个键值,而list[]是一组出现过key的位置。如(‘hello’,’14:2 23:4’)中,表示hello在14:2和23:4这两个位置出现过。

gin使用:

  • 单值稀疏数据搜索
  • 多列任意搜索,当用户的需求是按照任意列进行搜索时,gin支持多列展开单独建立索引域。从这边可以看出gin和btree都适用联合索引,两者的区分就是,看索引是否是任意的,如果第一个索引列是必有的可以选择btree,相反选择gin。
5.1 前后模糊索引- pg_trgm

对于前后都需要模糊的字段需要用到pg_trgm索引,需要注意的是,数据库的lc_type不能为‘C’,可以通过命令 \l+ database_name 来查看。需要提前创建扩展:

CREATE EXTENSION btree_gin;
CREATE EXTENSION pg_trgm

索引创建:

CREATE INDEX idx_vehiclestructured_plateno_like ON viid_vehicle.vehiclestructured USING GIN (plateno GIN_TRGM_OPS)
5.2 pg_trgm原理

pg_trgm使用时将字符串的前端添加2个空格,末端添加一个空格,之后每三个连续的字符串作为一个TOKEN进行拆分,对TOKEN建立GIN倒排索引。

查看字符串的原理:

SELECT SHOW_TRGM('viid');
结果:show_trgm         
-----------------------------{"  v"," vi","id ",iid,vii}
5.3  物理结构

逻辑结构

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

  • 只索引基表的一列
keyvalue
Key1Posting list( or posting tree)
Key2Posting list( or posting tree)
  • 索引基表的多列(复合、多列索引)
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索引主要由Entry tree和posting tree(or posting list)组成,其中Entry tree是GIN索引的主结构树,posting tree是辅助树。

entry tree类似于b+tree,而posting tree则类似于b-tree(平衡树)。

另外,不管entry tree还是posting tree,它们都是按KEY有序组织的。

总结:组合索引是为每一个字段创建一个entry tree,当key对应的value数据较少则用链表形式,当达到一定数量则采用B树(平衡树)的模式,这个倒是像极了Java8 HashMap的内部数据部分结构

5.4 pg_trgm适用场景
  1. 有前缀的模糊查询,例如a%,至少需要提供1个字符。

  2. 有后缀的模糊查询,例如%ab,至少需要提供2个字符。

  3. 前后模糊查询,例如%abc%,至少需要提供3个字符。

5.5 查询流程

这个我没有找到相关博客文章的说明,但是根据上面对gin索引结构的说明,人工智能的回答可信度应该是有的。注意:下面是AI回答,作为思考考虑就行,下面介绍不保证正确。

6 brin

Brin索引是块级索引,它不是以行号为单位记录索引明细,而是记录每个数据块或者每段连续的数据块的统计信息。因此brin索引空间占用特别小,对数据写入、更新、删除的影响很小。

    Brin索引适合时序数据(timestamp类型),在时间或序列字段创建索引,进行等值、范围查询时效果好;

以及对存储空间比较严格的场景。

CREATE INDEX idx_vehiclestructured_plateno_like ON viid_vehicle.vehiclestructured USING BRIN(plateno);

Brin的优点

  • 顺序扫描会很快,它是索引顺序扫描的一种改进,如果键值的顺序和存储中块的组织顺序相同,则针对大表的统计型SQL性能会大幅提升。
  • 创建索引的速度非常快。
  • 索引占用的空间很小。

Brin的缺点:

  • Brin在很大程度上依赖于数据相邻性(在磁盘上附近发现相似的数据)。如果我们的数据非常的混乱,则Brin索引查询重叠的条目可能性就非常高。一旦我们的Brin索引开始重叠,就将匹配更多的记录,并且导致需要从源表中读取多个块范围,以找到我们要查找的记录。

适合:

  • 主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。比如有序时间这类的。

推荐文章:

PgSQL · 应用案例 · GIN索引在任意组合查询中的应用-阿里云开发者社区 (aliyun.com)

GIN索引 - foreast - 博客园 (cnblogs.com)

PostgreSQL GIN索引实现原理-阿里云开发者社区 (aliyun.com)

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

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

相关文章

Java中的LinkedBlockingQueue:原理、应用与性能深入剖析

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在当今这个多线程、高并发的时代&#xff0c;Java的并发编程显得尤为重要。而当我们提及Java的并发编程&#xff0c;不可不提的一…

性能压测-jstack的使用

Jstack命令使用 使用top命令查看cpu占用比较高的进程pidps H -eo pid,tid,%cpu|grep 71 &#xff08;71为进程数pid,tid为线程数&#xff09; 此命令答应 进程数为71 下所有的线程数&#xff0c;看哪个线程数占用的cpu较高 Jstack中线程数记录的是16进制&#xff0c;需要将步…

ipa文件证书监测有什么用?测试安装包有什么用?什么类型包需要要求资质?

哈喽大家好&#xff0c;我是咕噜签名分发可爱多。今天给大家介绍一下ipa文件证书监测有什么用&#xff0c;测试安装包有什么用&#xff0c;以及什么类型包需要要求资质。 IPA 文件证书监测主要用于验证和确认一个 iOS 应用程序是否具有合法的签名证书。下面是一些监测证书的用途…

SaaS应用加速:提高企业办公效率,解决业务挑战

随着企业业务的迅猛发展&#xff0c;为满足业务需求&#xff0c;企业纷纷投入更多SaaS应用以提高办公效率。然而&#xff0c;随着企业应用数量和用户数的不断增加&#xff0c;经常会遇到SaaS应用访问速度受限的问题。在这种情况下&#xff0c;SaaS应用加速解决方案受到越来越多…

1.Spring核心功能梳理

概述 本篇旨在整体的梳理一下Spring的核心功能,让我们对Spring的整体印象更加具体深刻,为接下来的Spring学习打下基础。 本片主体内容如下: Bean的生命周期依赖注入的实现Bean初始化原理推断构造方法原理AOP的实现这里要说明一下,我们这里说到的Spring,一般指的是Spring F…

matplotlib-条形图

日期&#xff1a;2024.03.14 内容&#xff1a;将matplotlib的常用方法做一个记录&#xff0c;方便后续查找。 from matplotlib import pyplot as plt# 设置画布大小&#xff0c;横坐标想分开&#xff0c;就要使用到子图 plt.figure(figsize(20,8),dpi 300)# 全局设置中文字体…

变量直接赋值、浅拷贝、深拷贝、递归、异常

对象拷贝(对象存在堆中) 变量直接赋值 赋值 就是一个&#xff0c;比如let obj2obj1 这就是赋值&#xff0c;只是把栈中存储的值&#xff0c;赋值给另一个变量 把obj1在栈中的地址&#xff0c;赋值给obj2 <script>let str hellolet str2 str //把str的值,赋值给str2.也…

【2024-完整版】python爬虫 批量查询自己所有CSDN文章的质量分:附整个实现流程

【2024】批量查询CSDN文章质量分 写在最前面一、分析获取步骤二、获取文章列表1. 前期准备2. 获取文章的接口3. 接口测试&#xff08;更新重点&#xff09; 三、查询质量分1. 前期准备2. 获取文章的接口3. 接口测试 四、python代码实现1. 分步实现2. 批量获取文章信息3. 从exce…

Java推荐算法——特征加权推荐算法(以申请学校为例)

加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知&#xff0c;推荐算法有很多种&#xff0c;例如&#xff1a; 1.加权推荐&#xff1a;分为简单的特征加权&#xff0c;以及复杂的混合加权。主要…

软件功能测试内容有哪些?湖南长沙软件测评公司分享

软件功能测试主要是验证软件应用程序的功能&#xff0c;且不管功能是否根据需求规范运行。是通过给出适当的输入值&#xff0c;确定输出并使用预期输出验证实际输出来测试每个功能。也可以看作“黑盒测试”&#xff0c;因为功能测试不用考虑程序内部结构和内部特性&#xff0c;…

【词云图绘制实战】——数据准备、清洗、多形式展示

文章目录 1 手动输入文本1.1 加载包1.2 分词处理1.2.1 普通分词方式1.2.2 hmm分词 1.2 词云图绘制1.2.1 wordcloud词云图1.2.2 wordcloud2词云图 2 读取文本数据2.1 读取文本数据2.2 分词处理2.3 词云图绘制2.3.1 wordcloud词云图2.3.2 wordcloud2词云图2.3.3 letterCloud词云图…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数&#xff0c;例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数&#xff0c;在小程序端的时候测试并无问题&#xff0c;但是发行到H5时首页加载会造成参数获取…