实例结构
- 内存结构
- 进程结构
内存结构
- 本地内存结构
- 分配给每个后端进程专用,后端进程启动时分配,关闭时释放
- 共享内存结构
- 由PostgreSQL服务器的所有进程共用,实例启动时自动分配,关闭时释放
进程结构
所有进程由 postgres 父进程派生出来
Postgres 父进程
- postgres 服务器进程是PostgreSQL服务器中所有进程的父进程。早期称为:“postmaster”。
- pg_ctl实用程序启动该进程,然后派生出各个后台进程,同时分配共享内存区域。
- 一个 postgres 服务器进程侦听一个网络端口,默认端口为 5432。
后端进程
- 后端进程(也称为 postgres)由postgres 服务器进程启动,并处理一个连接的客户端发出的所有查询。
- PostgreSQL 允许多个客户端同时连接;配置参数max_connections控制客户端的最大数量。
后台进程
- 有些进程是强制的,有些进程是可选的
- 后端写进程
- 把共享缓存区域的脏块写入数据文件
- WAL写进程
- 把WAL缓存区域的日志条目写入wal文件
- 检查点进程(CKPT)
- 自动定时保存修改的数据
- 数据库一致性判断标准依据
# 后台进程查看
ps -ef | grep postgres
Docker Desktop运行PostgreSQL
第一步:拉取 PostgreSQL 镜像
打开你的终端(Terminal)、命令提示符(CMD)或 PowerShell,执行以下命令,从 Docker Hub 拉取 PostgreSQL 的官方镜像。
docker pull postgres
这条命令会下载最新版本的 PostgreSQL 镜像。你也可以指定版本,例如 docker pull postgres:15 来拉取 PostgreSQL 15 的镜像
🐳 第二步:运行 PostgreSQL 容器
在终端中执行以下命令,这是启动一个基础 PostgreSQL 实例的最简方式:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
参数说明:
--name my-postgres:为容器命名,方便后续管理。-e POSTGRES_PASSWORD=mysecretpassword:必须设置的环境变量,用来指定数据库超级用户postgres的密码。请务必将mysecretpassword替换为你自己的强密码。-p 5432:5432:将容器的5432端口映射到宿主机的5432端口。-d:让容器在后台运行。postgres:指定使用的镜像名称。
第三步:交互式进入容器
如果你想在容器内进行更多操作,可以先进入容器的 /bin/bash:
docker exec -it <容器名> /bin/bash
进入容器后,再执行:
psql -U postgres
此时会进入 psql 交互界面,提示符变为 postgres=#,然后执行:
select datname,oid from pg_database;
即可列出所有数据库。完成后用 \q 退出 psql,再输入 exit 退出容器。
性能优化
- 索引类型
- 执行计划和成本估算
常用索引类型
1. B-tree(默认,全能选手)
B-tree 是 PostgreSQL 的默认索引类型,适用于绝大多数场景
-
支持操作符:
<,<=,=,>=,>,BETWEEN,IN,IS NULL,IS NOT NULL。 -
特殊能力:支持
LIKE 'prefix%'前缀匹配(但LIKE '%suffix'不支持);可直接返回排序结果,避免额外排序。 -
创建示例:
CREATE INDEX idx_users_email ON users (email);
2. Hash(等值查询专用)
Hash 索引只存储哈希值,因此仅支持 = 等值查询,不支持范围查询。
-
支持操作符:Hash索引存储的是被索引字段VALUE的哈希值,只支持等值查询。
-
特殊能力:Hash索引特别适用于字段VALUE非常长(不适合B-tree索引,因为B-tree一个PAGE至少要存储 3个索引行,所以不支持特别长的VALUE)的场景,例如很长的字符串,并且用户只需要等值搜索, 建议使用hash index。
-
优势:等值查询通常比 B-tree 更快,且索引体积更小。
-
创建示例:
CREATE INDEX idx_users_email_hash ON users USING HASH (email);