加入收藏 | 设为首页 | 会员中心 | 我要投稿 焦作站长网 (https://www.0391zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

PostgreSQL的B-tree索引的使用细说

发布时间:2021-10-09 12:33:36 所属栏目:动态 来源:互联网
导读:B-tree索引适合用于存储排序的数据。对于这种数据类型需要定义大于、大于等于、小于、小于等于操作符。 通常情况下,B-tree的索引记录存储在数据页中。叶子页中

postgres=# select amp.amprocnum, amp.amproc, amp.amproclefttype::regtype, amp.amprocrighttype::regtypefrom pg_opfamily opf, pg_am am, pg_amproc ampwhere opf.opfname = 'complex_ops'and opf.opfmethod = am.oidand am.amname = 'btree'and amp.amprocfamily = opf.oid; amprocnum | amproc | amproclefttype | amprocrighttype-----------+-------------+----------------+----------------- 1 | complex_cmp | complex | complex(1 row)

 

内部结构

 

使用pageinspect插件观察B-tree结构:

 

1demo=# create extension pageinspect;

 

索引的元数据页:

 

demo=# select * from bt_metap('ticket_flights_pkey');

 magic | version | root | level | fastroot | fastlevel

--------+---------+------+-------+----------+-----------

 340322 |  2 | 164 |  2 |  164 |   2

(1 row)

 

 

 

值得关注的是索引level:不包括root,有一百万行记录的表其索引只需要2层就可以了。

 

Root页,即164号页面的统计信息:

 

demo=# select type, live_items, dead_items, avg_item_size, page_size, free_size

from bt_page_stats('ticket_flights_pkey',164);

 type | live_items | dead_items | avg_item_size | page_size | free_size

------+------------+------------+---------------+-----------+-----------

 r |   33 |   0 |   31 |  8192 |  6984

(1 row)

 

 

 

该页中数据:

 

demo=# select itemoffset, ctid, itemlen, left(data,56) as data

from bt_page_items('ticket_flights_pkey',164) limit 5;

 itemoffset | ctid | itemlen |       data      

------------+---------+---------+----------------------------------------------------------

   1 | (3,1) |  8 |

   2 | (163,1) |  32 | 1d 30 30 30 35 34 33 32 33 30 35 37 37 31 00 00 ff 5f 00

   3 | (323,1) |  32 | 1d 30 30 30 35 34 33 32 34 32 33 36 36 32 00 00 4f 78 00

   4 | (482,1) |  32 | 1d 30 30 30 35 34 33 32 35 33 30 38 39 33 00 00 4d 1e 00

   5 | (641,1) |  32 | 1d 30 30 30 35 34 33 32 36 35 35 37 38 35 00 00 2b 09 00

(5 rows) 

 

第一个tuple指定该页的最大值,真正的数据从第二个tuple开始。很明显最左边子节点的页号是163,然后是323。反过来,可以使用相同的函数搜索。

 

PG10版本提供了"amcheck"插件,该插件可以检测B-tree数据的逻辑一致性,使我们提前探知故障。

PostgreSQL的B-tree索引的使用细说

(编辑:焦作站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读