【postgresql初级使用】小小索引大用途,奇妙的索引让大数据查询提升成百上千倍,多种索引类型的区别,你用对索引了吗?

索引介绍

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 索引介绍
  • 概述
  • 索引原理
  • 索引类型
    • B-Tree 索引
    • Hash 索引
    • GIN 索引
    • GiST 索引
    • SP-GiST 索引
    • BRIN 索引
    • Bloom 索引
  • 总结
  • 结尾

概述


本文主要分享索引的原理,在postgresql中支持的索引类型的概述。

索引原理


  • 索引的主要作用是提高数据库查询的效率。当表中有大量记录时,如果没有索引,查询操作可能需要遍历整个表,这会消耗大量的时间,占用大量的CPU和磁盘IO资源。而通过建立索引,数据库系统可以快速地定位到符合查询条件的记录,从而大大提高查询效率。

  • 索引如何可以快速查询呢?

  1. 索引是一般是将原始无规则的数据,按照特定的数据结构有序排列起业,形成一个新的排序数据结构。数据库中常常采用的数据结构主要以平衡树,如B树或B+树,还有哈希表等。
  1. 同时索引并不是将一行数据都进行排序,对某一列或多列组合建立索引,这样在有序的数据结构中查找,就可以非常快速的定位到数据的位置,再读取整行数据。这样可以做到索引数据相对于原始表数据,占用非常小的存储空间,甚至可以常驻内存,而原始数据只需要读取所需要的行即可,大大减少磁盘IO使用。
  • 此外,索引还有一些其他的优点,如加速表和表之间的连接、使用分组和排序子句进行数据检索等。但是,索引也会占用一定的磁盘空间,并且会增加数据插入、删除和更新的开销。因此,在创建索引时需要根据实际情况进行权衡和选择。

索引类型


在postgresql 中支持了丰富的索引类型,如btree, gin, gist, spgist, brin等索引类型,每种索引类型适应不同的数据类型进行选择,同时还支持一些用户定义的索引类型,如bloom类型的索引。

下面对索引类型进行概述。

B-Tree 索引

B-Tree索引,是postgresql 中默认的索引类型,因为它可以支持 >, >=, =, <=, <等比较操作符,可以应用在很多数据类型,同时可以在多列上创建B-Tree索引。

B-Tree索引的以多路平衡树为存储结构,它有序的存储数据,可以进行高效的搜索,范围查找,以及排序,因此任何可以进行线性排序的数据类型,都可以使用此种索引。

此外B-Tree索引除了查找外,还可以用于order by distinct子句的优化。

Hash 索引

Hash索引,存储的数据的HASH KEY,存储结构为hash table,因此在hash 索引中看不到原数据的值,它主要支持等值比较,不支持范围查找,同时也不支持多列上创建Hash索引。

Hash索引支持可以线程排序的数据类型,同时它对数据大小没有限制,因为最终存储的都是HASH KEY。

经常使用HASH索引的场景有:

  • 长字符串,Hash索引存储的值远远小于原数据,使用Hash索引会更有效;
  • 等值查询,如果某列基于等值查询,那么使用Hash索引会更有效;

GIN 索引

GIN索引(Generalized Inverted Index)称为通用倒排索引,常被用于复合数据类型,比如数组,jsonb, full text search全文搜索等。

在GIN索引中,对于复合数据中的数据项,存储对应的键值;在GIN索引中存储的每一个元索为 键与发布列表对;而发布列表是包含该键值的行ID,当然同一个行ID可以出现在多个发布列表中,因为一行可以包含多个键值,但是同一键值只保存一次。

对于支持的每种数据类型,都有相应的操作符。

GiST 索引

GiST索引(Generalized Search Tree),称为通用搜索树,基于平衡树来实现,它是一种通用的二分查找的索引框架,在此基础上可以实现B树,R树,和其它索引模式。

GiST索引主要用于point,cycle等几何图形,Rang类型,inet类型等等,它的优势在于,开发者可以为用户自定义类型实现一套更符合的索引模式,设计的目标成为数据类型的专家,而不是数据库的专家。

SP-GiST 索引

SP-GiST索引(Space-Partitioned Generalized Search Tree)称为空间分区的通用搜索树,它也是一个索引框架。

基于一个支持分区搜索树的数据结构,能够构建一系列不同的非平衡数据结构,如四叉树、k-d树和基数树。

这些结构的共同特点是它们会反复地将搜索空间分割成不需要等大的分区。当搜索与分区规则匹配良好时,搜索速度可以非常快。

BRIN 索引

BRIN(Block Range Index)是为处理非常大的表而设计的,这些表中的某些列与其在表中的物理位置具有某种自然相关性。

它是基于数据块的索引,而一个数据块中可能会存储多个数据行,索引中会记录数据块的一些摘要信息,这样就可以很快定位到查找键所在的数据块,然后在数据块内再进行查找。

例如,一个存储商店销售订单的表可能有一个日期列,该列记录了每个订单的下单日期,大多数情况下,较早的订单条目也会较早地出现在表中;一个存储邮政编码列的表可能自然地将一个城市的所有代码组合在一起。

由于BRIN索引非常小,扫描索引与顺序扫描相比增加的开销很小,可以避免扫描已知不包含匹配元组的大部分。

块范围的大小在索引创建时由pages_per_range存储参数确定。索引条目的数量将等于关系的大小(以页面为单位)除以pages_per_range的选定值。因此,该值越小,索引就越大(因为需要存储更多的块范围摘要信息)。通过选择合适的pages_per_range值,可以在索引大小和扫描效率之间找到平衡。

Bloom 索引

Bloom 索引基于 Bloom 过滤器(Bloom filters)提供了一种索引访问方法。

Bloom 过滤器是一种空间效率高的数据结构,用于测试一个元素是否是一个集合的成员。在索引访问方法的上下文中,它允许通过索引创建时确定大小的签名来快速排除不匹配的元组。

签名是索引属性的一种有损表示,因此容易产生误报(false positives);也就是说,它可能会报告一个元素在集合中,而实际上并不在。因此,必须使用堆条目中的实际属性值重新检查索引搜索结果。较大的签名可以降低误报的可能性,从而减少无用的堆访问次数,但当然也会使索引变得更大,从而扫描速度更慢。

这种类型的索引在表具有许多属性且查询测试这些属性的任意组合时最有用。传统的 B-tree 索引比 Bloom 索引更快,但可能需要多个 B-tree 索引来支持所有可能的查询,而 Bloom 索引只需要一个。然而,需要注意的是,Bloom 索引仅支持等值查询,而 B-tree 索引还可以执行不等值和范围搜索。

总结


Postgresql中支持了丰富的索引类型,如常用的Btree,Hash索引,还有针对复合类型的GIN索引,根据类型进行优化的GiST, SP-GiST索引,同时对于非常大的表,基于数据块的BRIN索引,使得索引占用空间更小。

除此之外,还有以扩展形式提供的Bloom索引,用于集合的判断,比传统Btree更有优势。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

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

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

相关文章

2024蓝桥杯网络安全部分赛题wp

爬虫协议 题目给了提示访问robots.txt 会出三个目录 访问最后一个 点进去就flag{22560c15-577c-4c8b-9944-815473758bad} packet 下载附件&#xff0c;这个是流量包 放wireshark流量分析 搜http协议 发现有cat flag命令&#xff0c;直接看他返回的流量 最后base64解码即可…

Linux-笔记 i2c-tools

1、i2c-tools介绍 1、在日常linux开发中&#xff0c;有时候需要确认i2c硬件是否正常连接&#xff0c;设备是否正常工作&#xff0c;设备的地址是多少等等&#xff0c;这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools&#xff0c;i2c-tools原理是通过操作/dev 路径 …

存储大作战:探索Local Storage与Session Storage的奥秘

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 存储大作战&#xff1a;探索Local Storage与Session Storage的奥秘 前言Local Storage与Session Storage简介数据存储生命周期容量限制安全性 前言 在Web的世界里&#xff0c;数据就像是一群流浪者&a…

TypeScript学习日志-第二十三天(装饰器Decorator)

装饰器Decorator 一、类装饰器 ClassDecorator 其中返回的 target 是 Http 的构造函数&#xff0c;有了构造函数就不会去破坏其自身原有的结构&#xff0c;当我们 Http 里面有多个属性或者方法的&#xff0c;当是我们不想看或者改变它&#xff0c;这时候可以在构造函数中增加即…

Ubuntu18.04 安装 anconda

anaconda官网 bash Anaconda3-2021.11-Linux-x86_64.sh一直回车&#xff0c;输入yes 选择安装目录 是否希望更新shell配置文件以自动初始化conda

组合数学汇总

阶乘、排列、组合 阶乘 x ! Π i : 1 x i x! \Pi_{i:1}^xi x!Πi:1x​i 。特殊情况0的阶乘是1。 排列 排列 P n m P_n^m Pnm​&#xff0c;从n个不同元素中取出m&#xff08;m≤n&#xff09;个元素&#xff0c;按照一定的顺序排成一列。第一个元素有n种选择&#xff0c;第…

AR人脸美妆SDK解决方案,让妆容更加贴合个人风格

美妆行业正迎来前所未有的变革&#xff0c;为满足企业对高效、精准、创新的美妆技术需求&#xff0c;美摄科技倾力打造了一款企业级AR人脸美妆SDK解决方案&#xff0c;为企业打开美妆领域的新世界大门。 革命性的人脸美妆技术 美摄科技的AR人脸美妆SDK解决方案&#xff0c;不…

TS学习-抽象类和静态成员

目录 1&#xff0c;抽象类1&#xff0c;为什么需要抽象类2&#xff0c;抽象成员3&#xff0c;设计模式-模板模式 2&#xff0c;静态成员1&#xff0c;什么是静态成员2&#xff0c;设计模式-单例模式 1&#xff0c;抽象类 1&#xff0c;为什么需要抽象类 有时&#xff0c;某个…

IDEA设置 | 个性化设置

文章目录 IDEA设置总结IDEA自动生成序列化ID IDEA设置总结 本篇博客将专注于整理IDEA新UI界面的相关设置 IDEA自动生成序列化ID CtrlAltS快捷键打开设置界面 选择Editor→Inspections→JVM languages→Test frameworks&#xff0c;勾选上Serializable class without serialVe…

Android中Fragment失去焦点的场景

在Android开发中&#xff0c;Fragment的生命周期方法onPause()会在以下几种情况下被调用&#xff1a; 当Fragment所在的Activity开始与其他Activity进行交互时&#xff0c;例如按下Home键或其他Activity获得焦点&#xff0c;导致当前Activity失去焦点&#xff0c;从而使得所有关…

SpringCloud微服务之Eureka、Ribbon、Nacos详解

SpringCloud微服务之Eureka、Ribbon、Nacos详解 1、认识微服务1.1、单体架构1.2、分布式架构1.3、微服务1.4、SpringCloud 2、服务拆分与远程调用2.1、服务拆分的原则2.2、服务拆分示例2.2、提供者与消费者 3、Eureka注册中心3.1、Eureka的结构和作用3.2、搭建eureka-server3.2…

学习Uni-app开发小程序Day4

今天是学习的第四天&#xff0c;老师的视频开始穿插讲解vue的知识&#xff0c;对身为小白的我还是很友好的。vue3的模版语法插值表达式 在根据视频学习的过程中&#xff0c;也对vue有一个回顾&#xff0c;但是出现一种情况&#xff0c;在script中声名一个值&#xff0c;在templ…

《构建高效审批系统:架构设计与实践》

在现代企业管理中&#xff0c;审批系统扮演着至关重要的角色&#xff0c;它不仅能够规范业务流程&#xff0c;提高工作效率&#xff0c;还能够增强企业的管理控制力和信息化水平。本文将探讨如何设计和构建一套高效的审批系统架构&#xff0c;以满足企业日常审批需求&#xff0…

知识付费_专业搭建知识变现平台_支持多种内容创作形式,网校平台的开发需要注意什么?有哪些误解?

每种产品的用户人群都不同&#xff0c;定位自然也不同&#xff0c;教育机构开发在线网校系统软件之前&#xff0c;首先我们确定要定位&#xff0c;明确您的用户人群&#xff0c;这样才能够帮助我们更好更快的将在线网校系统制作开发出来&#xff0c;也能够对后续的运营带来极大…

docker-compose部署gitlab

需要提前安装docker和docker-compose环境 参考&#xff1a;部署docker-ce_安装部署docker-ce-CSDN博客 参考&#xff1a;docker-compose部署_docker compose部署本地tar-CSDN博客 创建gitlab的数据存放目录 mkdir /opt/gitlab && cd mkdir /opt/gitlab mkdir {conf…

纹理映射技术在AI去衣应用中的关键作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图像处理领域中的应用也日益广泛。AI去衣&#xff0c;作为一种颇具争议的技术应用&#xff0c;指的是利用深度学习算法自动移除或替换图片中的衣物。在这一过程中&#xff0c;纹理映射技术扮演了不可或缺的角色。本…

初识指针(3)<C语言>

前言 前面两篇文章已经介绍了一些关于指针的基础知识&#xff0c;下面我们可以涉及一些指针较容易混淆的概念&#xff0c;本篇文章将介绍数组名的理解、指针输入打印数组的不同格式、一维数组传参的本质&#xff0c;冒泡排序&#xff0c;二级指针&#xff0c;指针数组等。 数组…

学SQL啦

3 SQL 3.1 SQL查询语言 新手学习网址&#xff1a;https://sqlzoo.net/wiki/SQL_Tutorial SQL查询语句语法结构和运行顺序 语法结构&#xff1a;select--from--where--group by--having--order by--limit运行顺序&#xff1a;from--where--group by--having--order by--limit-…

每日面试题

Java高级面试问题及答案 1. 请解释Java中的原子操作和原子类&#xff0c;以及它们是如何保证操作的原子性的&#xff1f; 答案&#xff1a; 在Java中&#xff0c;原子操作指的是不可中断的一个或一系列操作。即使在多线程环境中&#xff0c;这些操作也能够确保在没有同步机制…

关于verilog不能处理数组端口的解决方法

Verilog语言目前并不支持数组型端口&#xff0c;这不利于一些信号的管理。虽然System Veilog支持这样的定义&#xff0c;但是如果是芯片开发&#xff0c;就不得不用Verilog开发了。 即在Verilog中&#xff0c;不支持如下的端口定义&#xff1a; module divider_common# (param…