本文是《postgresql实战》的读书笔记,具体可以参考该书对应章节
postgresql 数据库是由一系列位于文件系统上的物理文件
组成。在数据库运行过程中,管理这些物理文件。通常这些物理文件称为数据库。
一、 逻辑和物理存储结构
在postgresql中有一个数据库集簇(Database Cluster)的概念,它是指由单个Postgresql服务器实例管理的数据库集合,组成数据库集簇的这些数据库使用相同的全局配置文件和监听端口、公用进程和内存结构
1.1 逻辑存储结构
数据库本身也是数据库对象,一个数据库集簇可以包含多个Database、多个User。每个Database以及Database中的所有对象都有他们的所有者即user.
创建一个Database时会为这个Database创建一个名为public的默认Schema
。每个Database可以有多个Schema。 可以将schema理解为名称空间。不同的schema可以有相同的Table、index、view等。
1.2 物理存储结构
数据库的文件默认保存在initdb时创建的数据库目录中。
目录 | 用途 |
base | 包含每个数据库对应的子目录的子目录 |
文件 | 用途 |
PG_VERSION | Postgresql主版本号文件 |
pg_hba.conf | 客户端认证控制文件 |
postgresql.conf | 参数文件 |
1.2.1 数据文件布局
(OID)
postgresql中的所有数据库对象都由各自的对象标识符(OID)进行内部管理,它们是无符号的4个字节整数。
数据库的OID存储在pg_database
系统表中。
数据库中的表、索引、序列等对象的OID存储在pg_class系统表中:
SELECT oid,relname,relkind
FROM pg_class
WHERE relname = 'product'
(二)、表空间
在postgresql中最大的逻辑存储单位是表空间,数据库中创建的对象都保存在表空间中。在创建数据库对象时,可以指定数据库对象的表空间,如果不指定则使用默认。
在初始化数据库目录时会自动创建pg_default
和pg_global
两个表空间。
-
pg_global
物理位置在数据库目录的global目录中。用来保存系统表 -
pg_default
加粗样式物理位置在base目录,是template0和template1数据库的默认表空间。创建数据库时,默认是从template1数据库进行克隆,因此除非特别指定了新建数据库的表空间,否则默认使用template1。也就是pg_default
(三)、表文件内部结构
在postgresql
中,将保存在磁盘中的块称为Page
,而将内存中的块称为Buffer
。 表和索引称为Relation
,行称为Tuple
。数据的读写是以Page
为最小单位,每个Page
默认大小为8KB
。 在编译Postgresql时指定BLCKSZ
大小决定Page
的大小。每个表文件由多个BLCKSZ
字节大小的Page组成,每个Page包含若干Tuple.对于I/O性能较好的硬件,并且以分析为主的数据库,适当增加BLCKSZ大小可以小幅度提升数据库性能。
当从数据库中检索数据时有两种典型的访问方式:顺序扫描和B树索引扫描。
- 顺序扫描通过扫描每个页面中的所有行指针顺序读取所有页面中的所有元组。
- B树索引扫描时,索引文件包含索引元组,每个元组由索引键和指向目标堆元组的TID组成。