B-tree 索引
大纲
-
对接执行器(操作与接口)
-
怎么快速查的(Design:高并发)
-
怎么存的(文件)
-
怎么维护(分裂、剪枝、回收、合并)
-
一些加速的trick:high-key、fastroot
-
流程梳理
概述:
索引本质就是一种提供数据的键值与元组标识符(TID)之间的映射。PG一共提供5种索引方式,以及4种索引类型。
五种索引:
- 唯一索引:UNIQUE;
- 主键索引:定义主键送主键索引,唯一的,是唯一索引的特殊类型;
- 多属性索引:多个属性上建立,但一般超过3个就没多大用了,除非每次的SQL的过滤条件都带着这些多属性;
- 条件(部分)索引:在表的子集上建立的索引,由一个表达式定义,这个存在pg_index里面的indpred中;
create intex t_a_idx on t(a) where b > 1 and b < 200;
- 表达式索引:索引可以建立在一个函数或者从表中属性计算出来的标量表达式上
create index t_a_idx on t(lower(a));
selecct * from t where lower(a) = 'jack';
存在pg_index里的indexprs中,在创建时就会去计算表达式的值,所以插入和更新相对慢,查询只有存在和索引相同表达式才会起作用;
部分索引用来限制索引的数量,表达式索引则是用表达式计算索引元组的键值。
四种索引类型:
- B-tree (> = <)
- Hash (=)
- Gist 通用搜索树
- GIN 倒排索引
索引相关系统表
这一节很重要,因为开发者需要跟进和维护
- pg_am:记录索引类型
每增加一种索引类型,都需要在pg_am里面增加一条数据,静态写到cpp里面;这个系统表的最后13个属性记录了每种索引提供给其他模块调用的13个接口函数;amoptions存了一个函数的OID,用于分析对索引的特性选项比如“fillfactor = 80”;
-
pg_opclass 和 pg_opfamily 定义索引支持的数据类型和运算符
一个opclass一定包含在一个opfamily中 -
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 部分索引的条件的表达式树