PostgreSQL索引描述

索引方式:唯一索引,主键索引,多属性索引,部分索引,表达式索引.

索引类型:B-Tree,Hash,GiST,GIN以及表达式索引

PostgreSQL所有索引都是“从属索引”,也就是说,索引在物理上与它描述的表文件分离。

索引也是对象,在表pg_class里有记录。

索引的内部结构与索引的访问方法(索引类型)相关。所有访问方法都通过页面来组织索引的内部结构,这样可以使用存储管理器提供的接口来访问索引。

索引方式

多属性索引:如果一个索引定义多一个一个属性,就称为多属性索引,用于组合查询。

PostgreSQL中的B-Tree,GiST,GIN都支持多属性索引。最多支持32个属性。

不仅可以用表中的属性,而且还可以用函数或者表达式计算得到的值作为属性索引。

部分索引:建立在表上的子集的一个索引,该子集有一个表达式定义(表达式就是部分索引谓词)。

CREATE INDEX STU_NAME_INX ON STUDENT(NAME) WHERE (ID > 10 AND ID <20);

使用部分索引,能够减小索引规模,提高索引查询效率。

表达式索引:可以建立在函数或者从表中一个或者多个属性计算出来的标量表达式上。

CREATE INDEX STU_LOW_NAME_IDX ON STUDENT(LOWER(NAME));

表达式索引,只有在查询是使用与创建时相同的表达式才有作用。

部分索引谓词跟表达式索引的表达式都会存储在pg_index表indexprs属性中。 

在创建索引的时候,会根据表达式计算出实际索引值的范围,这会导致插入跟新速度变慢。

索引类型

B-Tree:一种类似于B+数的数据结构来存储数据的键值。

支持比较查询跟范围查询(>,=,<)。

Hash:Hash索引会使用hash函数对索引关键字进行散列,Hash只能处理=操作。

GiST:通用搜索树,这个需要单独来学习。

GIN:倒排索引,可以处理包含多个键的值(例如数组)。跟GiST类似。 

索引相关系统表

pg_am:

postgres=# select count(*) from pg_am;
 count
-------
     5
(1 row)

分别为:btree,hash,gist,gin,spgist。

如果是做数据库二次开发的,可以关注后面13个字段,是提供13个模块的接口函数。

pg_index:

创建个索引,会再pg_class创建个添加一条记录,也会再pg_index添加一条。

pg_index用于记录索引的相关信息。

几个重要字段说明:

  indexrelid   该索引在pg_class里的OID。

  indrelid     表示索引依赖的的基表的OID。

  indisvalid 为真,那么可用于查询,否则表示该索引不完善,需要在INSERT/UPDATE操作时更新。

  indkey 这为一个数组,记录这个索引在基表那些字段上面建立了索引,如果数组里有值为0,那么索引属性在表属性上是一个表达式。

  indexprs 索引的表达式

pg_opclass:

每一个索引类型并不直接设定该类型的索引所要操作的数据类型。该表表明了索引索引方法在操作特定数据

类型的时候,需要使用的的操作集合。

还有几个系统视图,都是对索引操作类型的说明

pg_opfamily:

pg_amop:

pg_amproc:

 

  

时间: 2024-10-12 04:01:01

PostgreSQL索引描述的相关文章

PostgreSQL索引分类及使用

1.索引方式 PostgreSQL数据库支持单列index,多列复合 index, 部分index, 唯一index, 表达式index,隐含 index, 和并发index. 2.索引方法 PostgreSQL 支持 B-tree, hash, GiST, and GIN index methods. 3.索引使用范围 1).B-tree B-tree可以有效使用当一个查询包含等号(=)和范围操作符 (<, <=, >, >=, BETWEEN, and IN). 2).hash

PostgreSQL 索引膨胀

索引膨胀,主要针对B-tree而言 索引膨胀的几个来源: 大量删除发生后,导致索引页面稀疏,降低了索引的使用效率: PG9.0之前的版本,vacuum full会同样导致索引页面稀疏: 长时间运行的事务,禁止vacuum对表的清理工作二导致页面稀疏状态一致保持. 注意REINDEX会造成全表锁,不要在系统繁忙的时候操作 查看索引占用的空间: select pg_relation_size(oid)/1024/1024,relname from pg_class where relkind='i'

SQLServer 唯一键约束和唯一索引有什么区别?

以前也想了解到底有什么区别,但是搁着又忘记了,因为我们很少用唯一键约束.直到几天前同事给我个脚本来约束某个字段的唯一性,用的是唯一键约束,这问题又萦绕脑中了.看似有区别,又没发现什么大的区别!实际上也没多大区别,还是测试看看吧. USE [DemoDB] GO CREATE TABLE [dbo].[TableUniqueKey]( id int not null, name varchar(20) null ) GO CREATE TABLE [dbo].[TableUniqueIndex](

SQL查询表中的有那些索引

方法1. 使用系统表 -- 查询一个表中的索引及索引列 USE AdventureWorks2008 GO SELECT indexname = a.name , tablename = c. name , indexcolumns = d .name , a .indid FROM sysindexes a JOIN sysindexkeys b ON a .id = b .id AND a .indid = b.indid JOIN sysobjects c ON b .id = c .id

SQL Server性能优化(9)聚集索引

一.索引的概念和分类 索引的概念大家都知道,日常开发中我们也会使用常见的聚集索引.非聚集索引.但是除了这两者以外,sqlserver中还提供其他的索引,如: a. 唯一索引:不包含重复键的索引,聚集索引或者非聚集索引都可以是唯一索引. b. 包含列的索引:它扩展后不仅包含键列,还包含非键列. c. 全文索引 d. 空间索引 e. 筛选索引 f. XML 当然以上几种除了a和b基本上没用到过. 二.聚集索引的结构 要想使用聚集索引,必须了解聚集索引的概念以及它的原理.网上对聚集索引描述的资料有很多

海量数据处理之数据库索引

第一部分,数据库索引及其优化 一,什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 例如这样一个查询:select * from table1 where id=44.如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止:有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44(也就是在ID这一列找),就可以得知这一行的位置,也就是找到了这一行.可见,索引是用来定位的. 索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而

usb命令格式、描述符详解

一.USB命令 在USB规范里,对命令一词提供的单词为“Request”,但这里为了更好的理解主机与设备之间的主从关系,将它定义成“命令”. 所有的USB设备都要求对主机发给自己的控制命令作出响应,USB规范定义了11个标准命令,它们分别是:Clear_Feature. Get_Configuration.Get_Descriptor.Get_Interface.Get_Status.Set_Address. Set_Configuration.Set_Descriptor.Set_Interf

T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识,这些知识写一本小书也不为过.所以本文并不会深入讨论这些主题. 索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 精简来说,索引是一种结构.

SQLServer之创建唯一聚集索引

创建唯一聚集索引典型实现 唯一索引可通过以下方式实现: PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引. 主键列不允许空值. 在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束. 如果不存在该表的聚集索引,则可以指定唯一聚集索引. 有关详细信息,请参阅 Unique Constraints and Check Constraints