本文主要汇总 PostgreSQL 侧常用概念与配置要点:集群内数据库/模式/表等对象层级、索引用途与代价、pg_hba.conf 远程访问注意项,以及 psql 中 \dt+ 各列含义。
由 queue 碎片 basic-concepts、indexes、pg-hba、dt-plus 合并改写,服务于日常运维与读代码时的对照,不是百科全文。日常命令见 pgsql 日常运维速查;热备见 流复制热备。
对象层级与基本概念
| 概念 | 要点 |
|---|---|
| 集群 / 实例 | 一次 PostgreSQL 服务进程与数据目录;内可有多库 |
| 数据库 (Database) | 隔离的对象集合;连接时必须指定库名 |
| 默认库 | 常见 postgres;template1 为新建库模板;template0 为干净模板 |
| 模式 (Schema) | 库内命名空间;默认多用 public;可用 schema.object 或 search_path |
| 表 / 列 / 行 | 关系存储基本单位;列有类型与约束 |
| 主键 / 外键 | 唯一标识行;引用完整性 |
| 角色 (Role) | 权限主体;可登录角色即用户,也可作组角色 |
| 事务 | ACID;一组语句全成或全败 |
| 数据类型 | 数值、文本、时间、布尔、JSON/JSONB、数组、网络地址等 |
连接时「连到哪一库」与「对象在哪个 schema」是两层问题:库隔离更强,schema 用于库内组织。
索引:用途、代价与常见类型
作用
索引用额外结构保存键值到行定位(PostgreSQL 中常为 TID),避免大表上低效的全表扫描。优化器比较「用索引」与「扫表」成本后决定是否使用索引;选择性差或表很小时可能故意不用索引。
收益与成本
| 正面 | 负面 |
|---|---|
加速 WHERE / JOIN / 部分 ORDER BY/GROUP BY | 占磁盘 |
| 唯一索引可强制唯一性 | 拖慢 INSERT/UPDATE/DELETE(需维护索引) |
| 外键列上索引常利于检查与连接 | 需 VACUUM/REINDEX 等维护 |
本质是空间与写放大换读性能。只在真实慢查询路径与高选择性列上建索引。
B-Tree(默认最常用)
- 自平衡树;叶子存 (键, TID),支持等值与范围。
- 查找复杂度量级约 O(log N)。
- 范围查询可在叶子链表上顺序走。
其它类型(选用场景)
| 类型 | 典型用途 |
|---|---|
| Hash | 等值;不支持范围(使用场景相对受限) |
| GiST / GIN | 全文、JSONB、地理等复杂类型 |
| BRIN | 物理有序大表、范围查询,索引体积小 |
建哪类索引、建在哪些列,应结合 EXPLAIN (ANALYZE, BUFFERS) 与业务读写比,避免「凡列必建」。
pg_hba.conf 与远程访问
pg_hba.conf 按自上而下匹配:谁从哪来、连哪库、用何认证。postgresql.conf 中 listen_addresses 决定监听网卡。
危险示例(仅限短时实验)
# 切勿长期用于生产
host all all 0.0.0.0/0 trust
配合 listen_addresses = '*' 等于把库裸奔到可达网络。
相对可接受的远程测试
host all all 0.0.0.0/0 scram-sha-256
仍应用防火墙收紧源 IP;更好是 VPN / SSH 隧道 / 内网白名单。
操作顺序示意
- 改
postgresql.conf:listen_addresses(若需远程)。 - 改
pg_hba.conf:追加规则(注意顺序,更具体的规则靠前)。 systemctl reload/restart postgresql或SELECT pg_reload_conf();(hba 通常 reload 即可,以版本文档为准)。- 验证:
ss -lntp | grep 5432、客户端psql -h <host> -U <user> -d <db> -W。 - 测完立刻收回宽规则。
排障提示
| 现象 | 检查 |
|---|---|
| 连接被拒绝 | 防火墙、listen_addresses、服务是否监听 |
| 认证失败 | hba 匹配行、密码、认证方法 |
| 改配置无效 | 是否 reload;是否 PgBouncer 等中间层 |
路径示例(发行版不同):
- Debian/Ubuntu:
/etc/postgresql/<ver>/main/ - RHEL 系:
/var/lib/pgsql/data/或/var/lib/pgsql/<ver>/data/
\dt+ 输出列含义
psql 中 \dt+ 列出表并带附加元数据。示意:
Schema | Name | Type | Owner | Persistence | Access method | Size | Description
| 列 | 含义 |
|---|---|
| Schema | 所属模式,常见 public |
| Name | 表名 |
| Type | \dt 下多为 table |
| Owner | 所有者角色 |
| Persistence | permanent 普通持久表;unlogged 不写 WAL(崩溃可丢、一般不复制);temporary 会话级 |
| Access method | 多为 heap(行存) |
| Size | 表堆大约占用,通常不含索引与 TOAST;全量可用 pg_total_relation_size(...) |
| Description | COMMENT ON TABLE 注释,未设置则空 |
查看索引体积可用 \di+;库级可用 \l+。
验证与实践建议
- 概念:能说明「库 vs schema」「角色 vs 登录用户」「索引为何伤写」。
- 索引:对慢 SQL 先
EXPLAIN,再决定加/删索引。 - hba:任何
0.0.0.0/0+trust必须有时限与回滚步骤。 \dt+:用 Size 粗看膨胀,深入用pg_relation_size/pg_total_relation_size。