PostgreSQL 索引

B-tree 索引


大纲

  1. 对接执行器(操作与接口)

  2. 怎么快速查的(Design:高并发)

  3. 怎么存的(文件)

  4. 怎么维护(分裂、剪枝、回收、合并)

  5. 一些加速的trick:high-key、fastroot

  6. 流程梳理

概述:

索引本质就是一种提供数据的键值与元组标识符(TID)之间的映射。PG一共提供5种索引方式,以及4种索引类型。

五种索引:

  1. 唯一索引:UNIQUE;
  2. 主键索引:定义主键送主键索引,唯一的,是唯一索引的特殊类型;
  3. 多属性索引:多个属性上建立,但一般超过3个就没多大用了,除非每次的SQL的过滤条件都带着这些多属性;
  4. 条件(部分)索引:在表的子集上建立的索引,由一个表达式定义,这个存在pg_index里面的indpred中;
    create intex t_a_idx on t(a) where b > 1 and b < 200;
  5. 表达式索引:索引可以建立在一个函数或者从表中属性计算出来的标量表达式上
    create index t_a_idx on t(lower(a));
    selecct * from t where lower(a) = 'jack';
    存在pg_index里的indexprs中,在创建时就会去计算表达式的值,所以插入和更新相对慢,查询只有存在和索引相同表达式才会起作用;

部分索引用来限制索引的数量,表达式索引则是用表达式计算索引元组的键值。

四种索引类型:

  1. B-tree (> = <)
  2. Hash (=)
  3. Gist 通用搜索树
  4. GIN 倒排索引

索引相关系统表

这一节很重要,因为开发者需要跟进和维护

  1. pg_am:记录索引类型

每增加一种索引类型,都需要在pg_am里面增加一条数据,静态写到cpp里面;这个系统表的最后13个属性记录了每种索引提供给其他模块调用的13个接口函数;amoptions存了一个函数的OID,用于分析对索引的特性选项比如“fillfactor = 80”;

  1. pg_opclass 和 pg_opfamily 定义索引支持的数据类型和运算符
    一个opclass一定包含在一个opfamily中

  2. pg_class 和 pg_index
    每创建一个索引需要在 pg_class 和 pg_index 中添加一个元组
    pg_index里面的属性这里列一些:

  • indisclustered bool为真则在该索引建立聚簇
  • indcheckxmin bool若为真,在查询时需要检查事务的xmin判断索引是否可用,比如静态的pg_am这里就是false
  • indkey vector类型,如果数组中的0值表示对应的索引属性是在表属性上的一个表达式
  • indoption vector类型,每个属性的标志位信息,未排序的索引该值都为0
  • indexprs 创建时索引条件的表达式树,text类型
  • indpred 部分索引的条件的表达式树
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值