PostgreSQL中B-Tree索引的物理存储内容有哪些
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容主要讲解"PostgreSQL中B-Tree索引的物理存储内容有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PostgreSQL中B-Tre
千家信息网最后更新 2025年11月08日PostgreSQL中B-Tree索引的物理存储内容有哪些
本篇内容主要讲解"PostgreSQL中B-Tree索引的物理存储内容有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PostgreSQL中B-Tree索引的物理存储内容有哪些"吧!
一、测试数据
创建数据表,插入数据并创建索引。
testdb=# -- 创建一张表,插入几行数据testdb=# drop table if exists t_index; t_index values(16,'4','d');-- 创建索引alter table t_index add constraint pk_t_index primary key(id);DROP TABLEtestdb=# create table t_index (id int,c1 char(8),c2 varchar(16));CREATE TABLEtestdb=# insert into t_index values(2,'1','a');INSERT 0 1testdb=# insert into t_index values(4,'2','b');INSERT 0 1testdb=# insert into t_index values(8,'3','c');INSERT 0 1testdb=# insert into t_index values(16,'4','d');INSERT 0 1testdb=# testdb=# -- 创建索引testdb=# alter table t_index add constraint pk_t_index primary key(id);ALTER TABLEtestdb=# -- 索引物理文件testdb=# SELECT pg_relation_filepath('pk_t_index'); pg_relation_filepath ---------------------- base/16477/26637(1 row)索引文件raw data
[xdb@localhost utf8db]$ hexdump -C base/16477/2663700000000 01 00 00 00 20 5d 0e db 00 00 00 00 40 00 f0 1f |.... ]......@...|00000010 f0 1f 04 20 00 00 00 00 62 31 05 00 03 00 00 00 |... ....b1......|00000020 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................|00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 bf |................|00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|*00001ff0 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 |................|00002000 01 00 00 00 98 5c 0e db 00 00 00 00 28 00 b0 1f |.....\......(...|00002010 f0 1f 04 20 00 00 00 00 e0 9f 20 00 d0 9f 20 00 |... ...... ... .|00002020 c0 9f 20 00 b0 9f 20 00 b0 9f 20 00 00 00 00 00 |.. ... ... .....|00002030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|*00003fb0 00 00 00 00 04 00 10 00 10 00 00 00 00 00 00 00 |................|00003fc0 00 00 00 00 03 00 10 00 08 00 00 00 00 00 00 00 |................|00003fd0 00 00 00 00 02 00 10 00 04 00 00 00 00 00 00 00 |................|00003fe0 00 00 00 00 01 00 10 00 02 00 00 00 00 00 00 00 |................|00003ff0 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 |................|00004000
二、B-Tree索引物理存储
我们可以通过pageinspect插件查看索引的存储结构。
Page 0是索引元数据页:
testdb=# -- 查看索引页头数据testdb=# select * from page_header(get_raw_page('pk_t_index',0)); lsn | checksum | flags | lower | upper | special | pagesize | version | prune_xid ------------+----------+-------+-------+-------+---------+----------+---------+----------- 1/DB0E5D20 | 0 | 0 | 64 | 8176 | 8176 | 8192 | 4 | 0(1 row)testdb=# -- 查看索引元数据页testdb=# select * from bt_metap('pk_t_index'); magic | version | root | level | fastroot | fastlevel | oldest_xact | last_cleanup_num_tuples --------+---------+------+-------+----------+-----------+-------------+------------------------- 340322 | 3 | 1 | 0 | 1 | 0 | 0 | -1(1 row)root=1提示root页在第1页,通过page_header查看页头数据:
testdb=# select * from page_header(get_raw_page('pk_t_index',1)); lsn | checksum | flags | lower | upper | special | pagesize | version | prune_xid ------------+----------+-------+-------+-------+---------+----------+---------+----------- 1/DB0E5C98 | 0 | 0 | 40 | 8112 | 8176 | 8192 | 4 | 0(1 row)每个索引entries结构为IndexTupleData+Bitmap+Value,其中IndexTupleData占8个字节,Bitmap占4个字节,Value占4字节,合计占用16个字节,数据结构如下:
/* * Index tuple header structure * * All index tuples start with IndexTupleData. If the HasNulls bit is set, * this is followed by an IndexAttributeBitMapData. The index attribute * values follow, beginning at a MAXALIGN boundary. * * Note that the space allocated for the bitmap does not vary with the number * of attributes; that is because we don't have room to store the number of * attributes in the header. Given the MAXALIGN constraint there's no space * savings to be had anyway, for usual values of INDEX_MAX_KEYS. */ typedef struct IndexTupleData { ItemPointerData t_tid; /* reference TID to heap tuple */ /* --------------- * t_info is laid out in the following fashion: * * 15th (high) bit: has nulls * 14th bit: has var-width attributes * 13th bit: AM-defined meaning * 12-0 bit: size of tuple * --------------- */ unsigned short t_info; /* various info about tuple */ } IndexTupleData; /* MORE DATA FOLLOWS AT END OF STRUCT */ typedef IndexTupleData *IndexTuple; typedef struct IndexAttributeBitMapData { bits8 bits[(INDEX_MAX_KEYS + 8 - 1) / 8]; } IndexAttributeBitMapData; typedef IndexAttributeBitMapData * IndexAttributeBitMap;通过bt_page_items函数查看索引entries:
testdb=# select * from bt_page_items('pk_t_index',1); itemoffset | ctid | itemlen | nulls | vars | data ------------+-------+---------+-------+------+------------------------- 1 | (0,1) | 16 | f | f | 02 00 00 00 00 00 00 00 2 | (0,2) | 16 | f | f | 04 00 00 00 00 00 00 00 3 | (0,3) | 16 | f | f | 08 00 00 00 00 00 00 00 4 | (0,4) | 16 | f | f | 10 00 00 00 00 00 00 00(4 rows)相应的物理索引文件内容:
[xdb@localhost utf8db]$ hexdump -C base/16477/2663700000000 01 00 00 00 20 5d 0e db 00 00 00 00 40 00 f0 1f |.... ]......@...|00000010 f0 1f 04 20 00 00 00 00 62 31 05 00 03 00 00 00 |... ....b1......|00000020 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................|00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 bf |................|00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|-- 以上为元数据页的头部数据*00001ff0 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 |................|00002000 01 00 00 00 98 5c 0e db 00 00 00 00 28 00 b0 1f |.....\......(...|00002010 f0 1f 04 20 00 00 00 00 e0 9f 20 00 d0 9f 20 00 |... ...... ... .|00002020 c0 9f 20 00 b0 9f 20 00 b0 9f 20 00 00 00 00 00 |.. ... ... .....|00002030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|-- 以上为索引数据Page 0的头部数据*00003fb0 00 00 00 00 04 00 10 00 10 00 00 00 00 00 00 00 |................|00003fc0 00 00 00 00 03 00 10 00 08 00 00 00 00 00 00 00 |................|00003fd0 00 00 00 00 02 00 10 00 04 00 00 00 00 00 00 00 |................|00003fe0 00 00 00 00 01 00 10 00 02 00 00 00 00 00 00 00 |................|00003ff0 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 |................|00004000-- 以上为索引数据Page 0的索引数据
ItemPointerData
[xdb@localhost utf8db]$ hexdump -C base/16477/26637 -s 16304 -n 600003fb0 00 00 00 00 04 00 |......|00003fb6-- blockid=\x0000,offset=\x0004
t_info
[xdb@localhost utf8db]$ hexdump -C base/16477/26637 -s 16310 -n 200003fb6 10 00 |..|00003fb8t_info=\x0010,即16,表示tuple(索引项)大小为16个字节
到此,相信大家对"PostgreSQL中B-Tree索引的物理存储内容有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
索引
数据
内容
物理
存储
字节
文件
结构
头部
学习
实用
更深
兴趣
函数
可以通过
大小
实用性
实际
插件
操作简单
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
TGP下载软件开发
威海市驰云网络技术有限公司
使用与管理服务器
校报的网络技术
代理服务器上网会卡吗
广播电视网络安全保障工作方案
服务器监控王
计算机网络技术陈立岩课件
服务器关闭或地址错误的是
靠谱的pda软件开发服务
服务器文件夹权限管理软件
英雄联盟 连接版本服务器
数据库管理技术了5个阶段
怎么设置服务器管理员密码
物种信息查询数据库
智能网络与网络安全
重庆森趣互联网科技
浙江诚信网络技术服务商家
我与网络安全作文500字
靖江进口网络技术诚信合作
iis服务器管理器角色
南京投资分布式存储服务器
魔兽世界如何保存服务器
霆智服务器安全区
软件开发 座右铭
认证服务器失败
魔兽世界服务器都有哪个
天津网信办网络安全员
服务器安全防护知识
微软商店游戏服务器