数据库优化
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/database-optimization-sh-22bpy4。
技能介绍
慢查询从哪查起
线上接口偶发超时、报表扫全表拖垮 CPU,往往不是「加机器」能一劳永逸的。根因通常在执行计划:大表 Seq Scan、估计行数与实际严重偏离、或一次 HTTP 请求里打出十几条 SQL(典型 N+1)。在改 schema 或堆索引之前,需要一套可重复的读计划、验索引、控连接与读写路径的方法。
技能覆盖的核心能力
本技能把 PostgreSQL / MySQL 上常见的优化动作收成可执行的检查清单:
- EXPLAIN ANALYZE:从下往上读计划;关注 Seq Scan、Nested Loop 行数、无索引 Sort,以及
Rows estimated vs actual偏差(提示跑ANALYZE刷新统计信息)。 - 索引策略:默认 B-tree 与复合索引列顺序(等值在前,范围/排序在后);PostgreSQL 的 Partial / GIN / GiST 与覆盖索引(index-only scan)。
- N+1:父表 1 次查询 + 每个子项 1 次查询;开查询日志,单接口 SQL 数 >10 应警惕。
- 连接池:PgBouncer(transaction 模式)、
idle_in_transaction_session_timeout;MySQL 的max_connections与 ProxySQL;用pg_stat_activity/SHOW PROCESSLIST观测。 - 只读副本:SELECT 走副本、写走主库;考虑复制延迟;读后写一致性读必须用主库;路由在连接级而非单条 SQL 级。
- 分区:Range(时序)、Hash(均匀分布);表到 50–100GB 或需快速删历史数据时再考虑。
附带 Query Optimization Checklist(10 步)与 Dangerous Patterns(如 LIKE '%term%'、ORDER BY RANDOM()、深分页 OFFSET 应改 keyset/cursor)。
适用边界
技能是工程向备忘与决策树,不能替代对你库表、 workload 与 ORM 生成 SQL 的实测。副本延迟、事务锁、隐式类型转换导致索引失效等场景,仍需结合慢日志(如 PostgreSQL log_min_duration_statement)与业务 SLA 做权衡;未在资料中展开的其他引擎特性需自行查官方文档。
使用场景
- 生产接口 P99 突增,需用 EXPLAIN ANALYZE 从下往上读计划,确认大表是否 Seq Scan 并决定是否加 B-tree 或 Partial 索引
- APM 或慢日志显示同一 HTTP 请求打出超过 10 条 SQL,需对照技能中的 N+1 特征改 ORM 预加载或合并查询
- PostgreSQL 在 Serverless/高并发下连接数耗尽,需评估 PgBouncer transaction 模式及 idle_in_transaction_session_timeout
- 时序明细表接近或超过 50–100GB、需快速删旧分区,需选 Range/Hash 分区并检查查询是否带分区键
适合人员
- 维护 PostgreSQL 线上库、常处理慢查询告警的后端工程师,希望按清单核对索引使用与隐式类型转换
- MySQL 高并发业务下的 SRE,连接数逼近 max_connections,需要连接上限估算与 ProxySQL 复用对照
- 已做主从读写分离但遇「写入后立刻读」不一致的业务开发,需明确复制延迟与必须走主库的场景
- 负责超大明细表与报表的数据平台工程师,要在 EXPLAIN、覆盖索引与表分区之间做 retention 与扫描成本权衡