数据库性能优化
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/database-optimization-mnv9。
技能介绍
先解决哪些问题
当数据库出现以下情况时,这套方法论能帮你定位瓶颈:
- 慢查询频发,接口响应时间波动大
- 连接池耗尽,服务启动后连接数持续上涨
- 读写分离后出现数据不一致
- 大表查询或更新越来越慢,索引加了也没效果
- 批量插入/更新操作耗时过长
核心能力与关键步骤
这套技能围绕执行计划分析、索引策略、连接管理、读写分离、分区治理五个核心展开,关键步骤如下:
- 执行计划优先:永远先跑
EXPLAIN ANALYZE,从下往上读输出,重点看这些指标:
- 大表上的Seq Scan → 缺少有效索引
- 高行数的Nested Loop → 考虑换Hash/Merge Join
- 无索引的Sort → 给排序列加索引
- 预估行数与实际行数偏差大 → 统计信息过期,跑ANALYZE
- 索引策略选型:
- B-tree(默认):适用于等值、范围、排序查询,复合索引要把等值列放前面
- 部分索引(PostgreSQL):针对固定过滤条件的查询,索引体积更小
- GIN/GiST(PostgreSQL):分别用于数组/JSONB/全文搜索、空间/范围类型
- 覆盖索引:支持索引仅扫描,减少回表
- N+1查询检测:症状是1次查父表+N次查子表,开启查询日志,单个接口查询数超过10次就是危险信号
- 连接池配置:
- PostgreSQL:高并发/Serverless场景用PgBouncer事务模式,设置idle_in_transaction_session_timeout = '30s',用pg_stat_activity监控
- MySQL:按内存设置max_connections(每连接约10MB),用ProxySQL做连接复用,用SHOW PROCESSLIST监控
- 读写分离与副本路由:所有
SELECT走副本,写操作走主库,注意副本延迟(通常10-100ms),一致性敏感的读操作必须走主库,用连接级路由而非查询级 - 分区策略:表超过50-100GB或需要快速删旧数据时做分区,时序数据用范围分区,均匀分布用哈希分区
- 查询优化清单:包含10条可落地的检查项,比如替换
SELECT *、批量插入(500-1000行/批)、用EXISTS替代COUNT(*) > 0、避免在WHERE子句的索引列上使用函数等 - 危险模式规避:列出了8类高危写法,比如未索引列上的
LIKE '%term%'、深分页用OFFSET、无WHERE的UPDATE/DELETE等
适用边界与注意点
- 主要针对PostgreSQL和MySQL,其他数据库的部分策略需调整
- 索引不是越多越好,需结合查询场景和数据量权衡
- 副本延迟问题无法完全消除,需在业务逻辑中处理
- 分区表的查询和索引管理比普通表复杂,小表不建议分区
使用场景
- 排查线上查询变慢,跑`EXPLAIN ANALYZE`发现大表全表扫描,需补建B-tree或覆盖索引
- 调试接口延迟,开启查询日志统计每请求查询数,发现重复查子表的N+1查询
- 部署Serverless服务后连接数暴涨,需用PgBouncer事务模式配置连接池
- 配置读写分离时,确认副本延迟范围,为一致性读指定主库查询路由
适合人员
- 后端工程师,需要分析数据库执行计划、调整查询与索引以解决接口慢查询问题
- 数据库管理员,需要优化大表索引结构、配置连接池并治理分区表性能
- 架构师,需要设计高并发读写服务,落地读写分离与连接复用方案
- 全栈开发者,需要排查数据库N+1查询、连接耗尽等常见性能隐患