关于 django-query-plan-reading
这项技能帮助开发者分析特定 Django 查询集或 SQL 语句背后的数据库工作,指导生成和阅读查询计划、确定改动,并比较改动前后的计划。
主要功能
- 01为 ORM 和原生 SQL 生成计划
- 02检查扫描、连接、排序和估算
- 03依据计划结果选择改动
- 04比较改动前后的查询计划
适用场景
- 01排查缓慢的 Django 查询集
- 02判断索引是否有帮助
- 03验证查询改写的效果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-query-plan-reading安装后在 Claude Code 中输入/django-query-plan-reading确认已加载。
附带文件references/explain-checklist.md
详细介绍
Django 查询计划解读
当开销集中在某条特定的 SQL 语句或查询集上时,使用此技能。目标是解释数据库为何要执行这些操作,而不是根据 ORM 代码猜测。
工作流
-
获取确切的查询。
- 优先使用生成该查询的查询集。
- 如果从日志中的 SQL 开始,请附上绑定参数或具有代表性的字面值。
-
生成执行计划。
- 对于由 ORM 管理的 SQL,使用
queryset.explain()。 - 对于原始 SQL、视图、物化视图或从日志复制的 SQL,使用数据库的
EXPLAIN。 - 仅在安全环境中使用
analyze=True,因为数据库会执行该查询。
- 对于由 ORM 管理的 SQL,使用
-
从最深层节点向外解读。
- 找出表扫描、索引扫描、连接、排序、聚合和限制操作。
- 使用 analyze 时,对比估算行数与实际行数。
- 查找成本高且会向后续节点输送大量行的节点。
-
确定下一步更改。
- 缺少有选择性的访问路径:使用
django-index-design。 - 查询形状妨碍有效使用索引:改写筛选条件、排序或连接策略。
- 无法避免的大规模聚合:考虑使用
django-db-side-computation或django-materialized-views。 - 深度偏移导致的开销:使用
django-pagination-performance。
- 缺少有选择性的访问路径:使用
-
更改后重新运行相同的执行计划。
- 对比扫描类型、行数、排序节点、堆获取次数、缓冲区、规划时间和执行时间。
有关执行计划解读线索和前后对比审查说明,请参阅 explain-checklist.md。
安全注意事项
EXPLAIN ANALYZE会执行查询。除非清楚其影响,否则不要对修改操作、不安全函数和生产环境路径使用它。- 顺序扫描不一定不好。当表较小或谓词会返回表中的大部分数据时,顺序扫描可能是最佳选择。
- 使用索引也不一定好。随机堆访问、不准确的基数估算或索引后的排序仍可能成为主要开销。
验证
最后提供更改前后的执行计划摘录,并用通俗语言说明哪个节点发生了变化,以及这为何重要。
评论
支持 Markdown