Skip to content

Latest commit

 

History

History
128 lines (37 loc) · 4.57 KB

20191206_02.md

File metadata and controls

128 lines (37 loc) · 4.57 KB

PostgreSQL preview - 全局索引 global index

作者

digoal

日期

2019-12-06

标签

PostgreSQL , global index , 全局索引


背景

PG 目前只有本地索引,分区索引(partial index),表达式索引。

本地索引指索引是针对当前表里面数据的,不针对继承表的数据,所以是本地索引。

分区索引,指索引可以带where条件,所以也叫partial index。

表达式索引指索引支持表达式(immutable表达式)。

什么情况下需要全局索引呢?

例如一个分区表,需要对ID字段实施唯一、主键约束,就需要全局索引。(当然了,如果字段是分区字段,那么全局唯一可以在分区字段上用本地索引实现,但是其他字段要唯一的话,就必须用到全局索引)

索引是如何联系到数据的呢?keyvalue -> ctid(本地表的行号,blocknumber, offset)

如果要支持全局索引,索引到目标记录除了ctid,还需要知道这条记录在哪个目标子表。所以index leaf page内应该是 keyvalue -> tableoid+ctid 的内容。

global index的社区沟通

https://www.postgresql.org/message-id/CALtqXTcurqy1PKXzP9XO%3DofLLA5wBSo77BnUnYVEZpmcA3V0ag%40mail.gmail.com

全局分区索引

有了全局索引,可以保证分区表的全局唯一等,但是索引会变得很大,所以还需要分区全局索引。

create global index xx on table (c1,c2) partition by (c2) hash (4);

实现方法其实也比较简单,partial index,多棵树来构建。

参考

https://www.percona.com/blog/2019/11/20/proposal-for-global-indexes-in-postgresql/

https://www.postgresql.org/message-id/CALtqXTcurqy1PKXzP9XO%3DofLLA5wBSo77BnUnYVEZpmcA3V0ag%40mail.gmail.com

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

digoal's wechat