pgsql常用索引简写

news2024/9/20 5:33:03

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

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

索引优点:

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

索引缺点:

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

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.coloradmin.cn/o/1516457.html

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

相关文章

操作系统总结(第二周 第一堂)

前言&#xff1a; 第一周的重点就在于一张图表&#xff1a; 基于这张图&#xff0c;我们将陷入内核分为了两个大块Trap和Interrupt。同时我们知道一件事情任何一次I/O操作或者错误程序操作都将陷入内核&#xff0c;从而使得内核可以监控所有的外部设备以及维护整个电脑程序运行…

PowerPoint 2010

文章目录 一、界面介绍二、选项卡1. 文件选项卡2. 开始选项卡3. 插入选项卡4. 设计选项卡5. 切换选项卡6. 动画选项卡7. 幻灯片放映选项卡8. 视图选项卡9. 效果识别 三、幻灯片操作1.选择幻灯片2.移动(调整幻灯片顺序&#xff09;和复制3.删除幻灯片 四、幻灯片放映1.按次序放映…

FX110网:1月美国零售货币资金环比上升2.61%,嘉盛环比上升1.86%

美国商品期货交易委员会&#xff08;CFTC&#xff09;发布的最新月度报告显示&#xff0c;2024年1月零售货币存款与上月相比上升2.61%。 这份报告涵盖在美国运营的注册零售货币对交易商&#xff08;RFED&#xff09;和经纪自营商。包括嘉信理财&#xff08;CHARLES SCHWAB Futu…

由世界第一个AI软件工程师Devin引发的热潮背后----程序员到底会不会被代替?AI发展至如今是否初衷已变?

目录 一.Devin的登场是突破也是导火索 二.Devin的"逆天"能力 1、端到端构建和部署程序 2、自主查找并修复bug 3、训练和微调自己的AI模型 4、修复开源库 5、成熟的生产库也能做贡献 6、学习能力 三.Devin的出现甚至整个AI领域的进步,编程还有未来吗? 1.业…

PyQt6实战1

创建一个json处理的小工具 功能&#xff1a; 1.json格式化 2.jsonpath提取数据 3.保存文件 main.py from PyQt6.QtGui import QFocusEvent from PyQt6.QtWidgets import * from PyQt6.QtCore import * from PyQt6.QtGui import * import sys import json import time impo…

如何使用vscode创建Node.js服务并结合内网穿透实现远程访问本地服务

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

(学习日记)2024.03.11:UCOSIII第十三节:使用优先级的流程 (持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像&#xff08;C&#xff09; Baumer工业相机Baumer工业相机定序器功能的技术背景Baumer工业相机通过NEOAPI SDK使用定序器功能预期的相机动作技术限制定序器的工作原理 Baumer工业相机通过NE…

【CSP试题回顾】201712-1-最小差值

CSP-201712-1-最小差值 完整代码 #include<iostream> #include<vector> #include<cmath> using namespace std;int n, minDelta 10005;int main() { cin >> n;vector<int>arr(n);for (int i 0; i < n; i){cin >> arr[i];}for (i…

OD_2024_C卷_200分_7、5G网络建设【JAVA】【最小生成树】

package odjava;import java.util.Scanner;public class 七_5G网络建设 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 基站数量&#xff08;节点数&#xff09;int m sc.nextInt(); // 基站对数量&#xff08;边数&…

26-1 SQL 注入攻击 - delete注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、注入原理: 对于后台来说,delete操作通常是将对应的id传递到后台,然后后台会删除该id对应的数据。 如果后台没有对接收到的 id 参数进行充分的验证和过滤,恶意用户可能会…

应用程序角度来看linux闲余内存

第三行所指的是从应用程序角度来看&#xff0c;对于应用程序来说&#xff0c;buffers/cached 是等于可用的&#xff0c;因为buffer/cached是为了提高文件读取的性能&#xff0c;当应用程序需在用到内存的时候&#xff0c;buffer/cached会很快地被回收。 所以从应用程序的角度来…

让LED安全生产记录显示屏成为员工安全意识的警钟

随着科技的不断发展和进步&#xff0c;LED安全生产记录显示屏作为一种新型的安全生产管理工具&#xff0c;正在逐渐被各行各业广泛应用。在工厂、建筑工地、仓库等各类生产场所&#xff0c;LED安全生产记录显示屏的出现&#xff0c;不仅为管理者提供了实时监控和数据显示的便利…

【智能算法】蜻蜓算法(DA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2016年&#xff0c;Mirjalili受到蜻蜓静态和动态集群行为启发&#xff0c;提出了蜻蜓算法(Dragonfly algorithm, DA)。 2.算法原理 2.1算法思想 蜻蜓集群有两种行为目的&#xff1a;狩猎&#xf…

Oracle Primavera P6 Analytics 是什么,与P6的关系?

前言 Oracle Primavera P6 Analytics 是与P6有关的一个相对较新的模块&#xff0c;Primavera 用户社区在很大程度上尚未对其进行探索。 那么它到底有什么作用呢&#xff1f; 通过了解得知它旨在通过深入了解组织的项目组合绩效&#xff0c;帮助高级管理层对其项目组合做出更好…

[Linux] 进程间通信基础

&#x1f4bb;文章目录 &#x1f4c4;前言进程间通信基础概念 管道概念管道的工作原理模拟实现shell中的管道 共享内存概念接口的介绍共享内存的使用 &#x1f4d3;总结 &#x1f4c4;前言 你是否了解进程间是如何通信的呢&#xff1f;你是否知道管道的工作原理呢&#xff1f;管…

LeetCode142:环形链表

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

TSINGSEE青犀智能分析网关V4有限空间作业监护AI算法介绍及应用

在现代工业生产中&#xff0c;有限空间作业是一种常见的生产方式。然而&#xff0c;这种作业环境由于空间有限、出入口较为狭窄、人员操作复杂等因素&#xff0c;往往存在着较高的安全风险&#xff0c;因为自然通风不良&#xff0c;作业人员不能长时间在内工作。为了保障作业人…

linux环境基础开发工具2(gcc/g++ 、 make/ Makefile)

目录 Linux编译器-gcc/g使用 Linux项目自动化构建工具-make/Makefile Linux编译器-gcc/g使用 1. 背景知识 1.2 gcc/g -v 查看当前服务器的编译器版本 1.3 安装gcc / g sudo yum install -y gcc-c 1.4 预处理 -> 编译 -> 汇编 -> 链接 [wxqVM-4-9-centos Test]$ to…

如何在Windows搭建WebDav服务,并外网可访问

目录 1. 安装IIS必要WebDav组件 2. 客户端测试 3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网 3.1 打开Web-UI管理界面 3.2 创建隧道 3.3 查看在线隧道列表 4. 公网远程访问 4.1 浏览器访问测试 4.2 映射本地盘符访问 4.3 安装Raidrive客户端 总结&…