



索引结构验证:
一层结构:
create table tab1(idintprimary key,info text);insertintotab1selectgenerate_series(1,100),md5(random()::text);


创建一个表插入一百条数据。
对表进行分析:
vacuum analyze tab1;

查看 meta 层信息:
select*frombt_metap('tab1_pkey');

可以看到 root 块为 1,当前有 0 层,有 100 条数据。
查看根块的统计:
select*frombt_page_stats('tab1_pkey',1);

可以看到 btpo 为 0,是第 0 层。

所以这个根块既是根块又是页块 btpo_flags=2+1=3。
查看 root(leaf)页里面的内容
select*frombt_page_items('tab1_pkey',1);

共 100 行。
可以通过 ctid 查询表。

二层结构:
插入大量数据使叶块分裂。
insertintotab1selectgenerate_series(101,10000),md5(random()::text);

查看 meta 层信息

此时可以看到 root 为 3,表明根块变成了第 3 块了(刚才根块是第一块),level=1,现在有两层,根块在第 0 层。
查看根块信息:

可以看到第三块是根块,btpo_flags=2.
查看根块里面的内容:

可以看到,根块里面现在存放的是叶块的指针。
再看一下刚才的第一个块。

可以看到,他变成叶块了,属于第 0 层。
查看页块的数据。

可以看到页块存放了实际的数据,这与B 树的性质不谋而合。
三层结构:
继续插入数据,导入 B 树增长到 3 层。
insertintotab1selectgenerate_series(10001,1000000),md5(random()::text);

查看 meta 层信息:

根块变成第 412 块了,现在有三层(level=2)。
查看根块信息

查看根块内容

可以看到根块里面存放了枝块的指针。原来(3,0)是根块,现在变成枝块了。
看这个枝块的信息

他的标记变成 0 了,是一个枝块,属于第 1 层。
索引结构由 autovacuum 维护。
pg 也支持 hash 索引:

文章转载自kk的DBA随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




