PostgreSQL 数据库笔记

76 阅读3分钟

实例结构

  • 内存结构
  • 进程结构

内存结构

  • 本地内存结构
    • 分配给每个后端进程专用,后端进程启动时分配,关闭时释放
  • 共享内存结构
    • 由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);
    

执行计划和成本估算

执行计划.png