一、基础连接与库表操作(psql 常用)
1. 连接数据库
bash
运行
# 本地连接
psql -U postgres -d mydb
# 远程连接
psql -h 192.168.1.100 -p 5432 -U postgres -d mydb
2. psql 常用元命令
\l--- 列出所有数据库\c mydb--- 切换数据库\dt--- 查看当前库所有表\d users--- 查看表结构(字段、类型、索引、约束)\du--- 查看所有用户及权限\q--- 退出 psql
3. 库 / 表 / 索引基础 SQL
sql
-- 创建库
CREATE DATABASE mydb;
-- 创建表(含约束、自增、注释)
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100),
create_time TIMESTAMP DEFAULT now(),
remark TEXT
);
COMMENT ON TABLE users IS '用户表';
-- 新增/修改/删除索引
CREATE INDEX idx_users_username ON users(username);
DROP INDEX idx_users_username;
二、开发常用 SQL 技巧
1. 增删改查进阶
- RETURNING(插入 / 更新后返回字段)
sql
INSERT INTO users(username) VALUES('zhangsan') RETURNING id, create_time;
- UPSERT(存在则更新,不存在则插入)
sql
INSERT INTO users(id, username)
VALUES (1, 'lisi')
ON CONFLICT(id) DO UPDATE SET username = EXCLUDED.username;
2. JSON/JSONB 灵活存储(替代 NoSQL)
sql
-- 插入 JSON
INSERT INTO configs(data) VALUES('{"theme":"dark","lang":"zh"}'::JSONB);
-- 查询 JSON 字段
SELECT data->>'theme' AS theme FROM configs;
-- JSON 条件查询(可建索引加速)
SELECT * FROM configs WHERE data @> '{"lang":"zh"}'::JSONB;
3. 分页、排序、聚合
sql
-- 分页(OFFSET 大表性能差,推荐游标/键值分页)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
-- 窗口函数(分组排名、累计)
SELECT username,
RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS rank
FROM employees;
三、日常监控与问题排查
1. 连接与会话
sql
-- 查看所有活动连接
SELECT pid, usename, datname, state, query FROM pg_stat_activity;
-- 杀掉异常会话(谨慎!)
SELECT pg_terminate_backend(12345);
2. 慢查询定位(需开启 pg_stat_statements)
sql
-- 按平均耗时排序慢查询 TOP10
SELECT queryid, query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY mean_time DESC LIMIT 10;
3. 表 / 索引膨胀与死元组
sql
-- 查看表死元组比例
SELECT relname, n_live_tup, n_dead_tup,
n_dead_tup::float/(n_live_tup+n_dead_tup) AS dead_ratio
FROM pg_stat_user_tables;
四、日常维护(必做)
1. VACUUM 清理(自动 / 手动)
- 删除 / 更新后空间不会立即释放,需清理 "死元组"
sql
-- 手动清理(业务低峰)
VACUUM ANALYZE users;
-- 全库深度清理(锁表,谨慎)
VACUUM FULL;
2. 统计信息更新
sql
-- 更新单表统计(优化器依赖)
ANALYZE users;
3. 磁盘与大小检查
sql
-- 数据库大小
SELECT pg_size_pretty(pg_database_size('mydb'));
-- 表大小(含索引)
SELECT pg_size_pretty(pg_total_relation_size('users'));
五、备份与恢复(数据安全)
1. 逻辑备份(pg_dump)
bash
运行
# 全库备份
pg_dump -U postgres mydb > mydb_backup.sql
# 仅备份 schema
pg_dump -s -U postgres mydb > mydb_schema.sql
2. 物理备份(pg_basebackup)
bash
运行
# 基础全量备份
pg_basebackup -D /backup/pg -U postgres -P -Xs
3. 恢复
bash
运行
# 逻辑恢复
psql -U postgres -d mydb < mydb_backup.sql
六、典型应用场景
- 企业级系统:ERP、CRM、财务、电商(强事务、复杂查询)
- GIS 地理信息:PostGIS 扩展,地图、物流、轨迹、围栏
- IoT 时序数据:TimescaleDB 扩展,传感器、监控、日志
- Web 应用:CMS(Drupal/WordPress)、社交、用户配置(JSONB)
- 数据仓库 / BI:CTE、窗口函数、并行查询
七、配置优化要点(postgresql.conf)
shared_buffers:内存 25%--40%work_mem:排序 / 哈希内存(512MB--2GB)maintenance_work_mem:VACUUM / 建索引内存max_connections:连接数(配合 PgBouncer 连接池)
八、生产环境最佳实践
- 禁用超级用户直连,按业务分用户、最小权限
- 定期备份(全量 + WAL 归档)
- 开启慢查询日志、连接监控
- 自动 VACUUM/ANALYZE
- 连接池 PgBouncer、读写分离、Citus 分片