暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 索引结构揭秘

kk的DBA随笔 2024-11-29
56

索引结构验证:

一层结构:

  1. create table tab1(idintprimary key,info text);

  2. insertintotab1selectgenerate_series(1,100),md5(random()::text);

创建一个表插入一百条数据。

对表进行分析:

  1. vacuum analyze tab1;

查看 meta 层信息:

  1. select*frombt_metap('tab1_pkey');

可以看到 root 块为 1,当前有 0 层,有 100 条数据。

查看根块的统计:

  1. select*frombt_page_stats('tab1_pkey',1);

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

所以这个根块既是根块又是页块 btpo_flags=2+1=3。

查看 root(leaf)页里面的内容

  1. select*frombt_page_items('tab1_pkey',1);

共 100 行。

可以通过 ctid 查询表。

二层结构:

插入大量数据使叶块分裂。

  1. insertintotab1selectgenerate_series(101,10000),md5(random()::text);

查看 meta 层信息

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

查看根块信息:

可以看到第三块是根块,btpo_flags=2.

查看根块里面的内容:

可以看到,根块里面现在存放的是叶块的指针。

再看一下刚才的第一个块。

可以看到,他变成叶块了,属于第 0 层。

查看页块的数据。

可以看到页块存放了实际的数据,这与B 树的性质不谋而合。

三层结构:

继续插入数据,导入 B 树增长到 3 层。

  1. insertintotab1selectgenerate_series(10001,1000000),md5(random()::text);

查看 meta 层信息:

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

查看根块信息

查看根块内容

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

看这个枝块的信息

他的标记变成 0 了,是一个枝块,属于第 1 层。

索引结构由 autovacuum 维护。

pg 也支持 hash 索引:



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

评论