用途
SQL Query Optimizer 用于分析和优化 SQL 查询,目标是提升查询性能。它围绕 EXPLAIN 执行计划、索引建议、查询重写和性能基准测试展开,帮助定位慢查询的根因并给出可执行的优化方案。
主要能力
EXPLAIN 分析
通过 EXPLAIN ANALYZE 查看查询计划,识别性能问题。示例中针对一个包含 LEFT JOIN、GROUP BY、ORDER BY 和 LIMIT 的查询,分析输出指出三类问题:orders 表上的顺序扫描(user_id 无索引)、users 表上的顺序扫描(created_at 无索引)、以及全表扫描开销较大。
索引建议
针对顺序扫描问题给出索引创建方案。示例中 orders 表按 user_id 过滤时发生顺序扫描,过滤掉 99950 行;创建 CREATE INDEX idx_orders_user_id ON orders(user_id); 后改为索引扫描,示例中性能从 89ms 提升到 0.09ms。
查询重写
提供多种重写模式:
- 避免 SELECT *:只取需要的列,示例称可快 50% 并减少网络传输。
- 用 EXISTS 替代 IN:示例称在大数据集上快 3 倍。
- 避免在索引列上使用函数:如
LOWER(email)会导致索引失效,可改为直接比较或创建函数索引CREATE INDEX idx_users_email_lower ON users(LOWER(email));。 - 使用覆盖索引:
CREATE INDEX idx_users_email_covering ON users(email) INCLUDE (id, name);可实现仅索引扫描。 - 优化 JOIN 顺序:先过滤再连接,或用 CTE 提升可读性。
复合索引
针对 WHERE user_id = X AND status = 'active' ORDER BY created_at DESC 这类查询模式,建议 CREATE INDEX idx_orders_user_status_created ON orders(user_id, status, created_at DESC);,并说明列顺序规则:等值过滤 → 范围过滤 → 排序列。同时列出该索引可支持与不支持的查询示例。
性能基准测试
提供 TypeScript 基准脚本示例(scripts/benchmark-queries.ts),使用 PrismaClient 和 perf_hooks,对查询执行多次迭代,输出平均、最小、最大耗时,并对比原始查询与优化查询的改进百分比。
慢查询检测
提供 scripts/detect-slow-queries.ts 示例,通过设置 log_min_duration_statement 并查询 pg_stat_statements,按平均执行时间排序输出慢查询列表,包含调用次数、平均耗时和最大耗时。
优化检查清单
以 TypeScript 接口形式列出查询、问题、建议和预估改进,例如缺失索引、SELECT *、全表扫描等。
使用方式
资料中未提供具体的安装命令或调用方式,仅包含分析示例、SQL 语句、索引脚本和 TypeScript 脚本示例。
适用场景
- 排查慢查询并理解执行计划
- 为 JOIN、过滤、排序设计索引
- 重写低效 SQL(子查询、函数包裹、SELECT *)
- 建立查询性能基准与前后对比
- 监控数据库慢查询
限制
资料未说明支持的数据库类型范围、版本要求、收费方式或平台限制。示例主要基于 PostgreSQL 语法(如 EXPLAIN ANALYZE、pg_stat_statements、INCLUDE 覆盖索引),其他数据库的兼容性暂未提供。