性能优化
需要设计、优化或扩展 PostgreSQL/MongoDB…
适用于使用 PostgreSQL 或 MongoDB 构建生产级应用时,进行数据库模式设计、索引优化、事务管理、复制分片与性能调优。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要设计、优化或扩展 PostgreSQ通用
解决思路
- 根据需求选择数据库:需要强 ACID 和复杂 JOIN 用 PostgreSQL;需要灵活模式和水平扩展用 MongoDB;也可混合使用。
- PostgreSQL 模式设计:遵循 1NF/2NF/3NF;读密集场景反规范化。
- 使用 SERIAL 或 UUID 作为主键;使用复合主键(如 order_id, product_id)管理多对多关系。
- 定义外键并指定 ON DELETE CASCADE/SET NULL/RESTRICT 控制级联行为。
- 使用 CHECK 约束(如 price > 0)、UNIQUE 约束和部分唯一索引(CREATE UNIQUE INDEX ... WHERE active = true)。
- 创建审计追踪:建 audit_log 表,写触发器函数记录 INSERT/UPDATE/DELETE 的 old_data 和 new_data,附加 AFTER 触发器。
- 创建触发器自动更新 updated_at 字段(BEFORE UPDATE)。
- 使用标准视图封装复杂查询;使用物化视图存储预计算结果,创建索引,用 REFRESH MATERIALIZED VIEW [CONCURRENTLY] 刷新。
- MongoDB 模式设计:一对少用嵌入,一对多/多对多用引用,混合方法嵌入常用字段。
- 对时间序列数据用桶模式:按时间窗口分组测量值,预计算摘要。
- 用计算模式存储预聚合数据;用多态模式在单一集合存不同结构文档。
- 使用聚合管道:$match, $group, $sort, $limit, $lookup, $unwind, $project 等阶段处理数据。
- PostgreSQL 索引:为外键和频繁过滤/排序列建 B-tree 索引;复合索引注意列顺序(等值、排序、范围)。
- 使用部分索引(WHERE active = true)、表达式索引(LOWER(email))、GIN 索引支持全文搜索(tsvector)和 JSONB。
- 监控索引:查询 pg_stat_user_indexes 中 idx_scan = 0 的未使用索引并删除。
- MongoDB 索引:创建单字段、复合(遵守 ESR 规则:Equality, Sort, Range)、多键、文本、地理空间索引。
- 使用索引属性:TTL(expireAfterSeconds)、部分(partialFilterExpression)、大小写不敏感(collation)、后台创建(background: true)。
- 用 explain('executionStats') 和 $indexStats 分析索引使用情况。
- PostgreSQL 事务:用 BEGIN/COMMIT/ROLLBACK;用 SAVEPOINT 部分回滚;设置隔离级别(READ COMMITTED, REPEATABLE READ, SERIALIZABLE)。
- 使用咨询锁(pg_advisory_lock/unlock)和行级锁(SELECT ... FOR UPDATE/FOR SHARE/SKIP LOCKED)控制并发。
- MongoDB 事务:用 session.startTransaction()、commitTransaction()、abortTransaction() 执行多文档事务;配置 writeConcern(w: majority, j: true)和 readConcern。
- 使用原子单文档操作:$inc, $push, findOneAndUpdate 等。
- PostgreSQL 复制:配置流复制(wal_level=replica, max_wal_senders, hot_standby, 复制用户, pg_hba.conf, primary_conninfo);配置逻辑复制(CREATE PUBLICATION/SUBSCRIPTION)。
- 用 pg_ctl promote 提升备库;监控复制延迟(pg_stat_replication, pg_wal_lsn_diff)。
- MongoDB 复制:用 rs.initiate() 初始化副本集;rs.add/rs.remove 增删成员;配置 priority 0、hidden、arbiter、slaveDelay 成员。
- 配置读偏好:primary, primaryPreferred, secondary, secondaryPreferred, nearest;设置 readConcernLevel。
- MongoDB 分片:选择高基数、均匀分布、查询隔离的分片键;用哈希或复合分片键。
- 分片设置:启动配置服务器(--configsvr)、分片服务器(--shardsvr)、mongos;用 sh.addShard 添加分片;sh.enableSharding 启用分片;sh.shardCollection 分片集合。
- 用 explain() 检查查询目标是 SINGLE_SHARD 还是 ALL_SHARDS;配置区域分片(sh.addShardToZone, sh.updateZoneKeyRange)。
- PostgreSQL 分区:用声明式分区按范围、列表、哈希分区;利用分区修剪(EXPLAIN 查看扫描的分区)。
- 查询优化:PostgreSQL 用 EXPLAIN ANALYZE,查询 pg_stat_statements,避免 SELECT *,用 EXISTS 代替 IN,用 JOIN 避免 N+1,用窗口函数。
- MongoDB 查询优化:用投影限制返回字段,创建覆盖查询,避免 $ne,谨慎用 $lookup,聚合中先 $match 后 $lookup。
- 连接池:PostgreSQL 用 pg Pool 或 PgBouncer(pool_mode=transaction, max_client_conn, default_pool_size);MongoDB 配置 maxPoolSize, minPoolSize, maxIdleTimeMS。
- PostgreSQL 维护:定期 VACUUM ANALYZE,更新统计信息,监控慢查询日志,设置 autovacuum,用 pg_dump/WAL 归档备份。
- PostgreSQL 安全:用 SSL/TLS,行级安全,最小权限,参数化查询,定期更新。
- MongoDB 维护:启用认证授权,用 TLS,定期 mongodump 备份,用 Atlas/Ops Manager 监控,保持版本更新。
- 数据建模决策:PostgreSQL 用于强 ACID、复杂关系、稳定模式;MongoDB 用于灵活模式、水平扩展、JSON 原生、嵌套数据;可混合使用。
- 避免 PostgreSQL 反模式:不要用 JSONB 存可查询的结构化数据,不要过度索引,避免 N+1 查询。
- 避免 MongoDB 反模式:不要有无界数组(超过 16MB),不要用单调递增或低基数分片键,为嵌入式文档字段建索引。
- 故障排除 PostgreSQL:启用慢查询日志(log_min_duration_statement),查 pg_stat_statements,用 pg_terminate_backend 终止长查询,查 pg_locks 解决锁争用。
- 故障排除 MongoDB:启用 profiling(slowms),查 system.profile,用 explain 分析,检查复制延迟(rs.printSecondaryReplicationInfo),调整 oplog 大小(replSetResizeOplog),检查 chunk 分布(sh.status)。
适用边界 · 注意事项
- 不适用于 Redis、Cassandra 等非关系型/非文档型数据库的管理。
- 不适用于不涉及数据库设计、查询优化或规模扩展的简单 CRUD 应用。
- 若完全依赖特定云厂商的托管数据库且不允许自定义配置,则部分做法不适用。