mcpField
D
django-query-plan-reading

django-query-plan-reading

github.com/lvtd-llc数据与数据库162 次安装7 周前更新
代码仓库

关于 django-query-plan-reading

这项技能帮助开发者分析特定 Django 查询集或 SQL 语句背后的数据库工作,指导生成和阅读查询计划、确定改动,并比较改动前后的计划。

主要功能

  1. 01为 ORM 和原生 SQL 生成计划
  2. 02检查扫描、连接、排序和估算
  3. 03依据计划结果选择改动
  4. 04比较改动前后的查询计划

适用场景

  1. 01排查缓慢的 Django 查询集
  2. 02判断索引是否有帮助
  3. 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 代码猜测。

工作流

  1. 获取确切的查询。

    • 优先使用生成该查询的查询集。
    • 如果从日志中的 SQL 开始,请附上绑定参数或具有代表性的字面值。
  2. 生成执行计划。

    • 对于由 ORM 管理的 SQL,使用 queryset.explain()。
    • 对于原始 SQL、视图、物化视图或从日志复制的 SQL,使用数据库的 EXPLAIN。
    • 仅在安全环境中使用 analyze=True,因为数据库会执行该查询。
  3. 从最深层节点向外解读。

    • 找出表扫描、索引扫描、连接、排序、聚合和限制操作。
    • 使用 analyze 时,对比估算行数与实际行数。
    • 查找成本高且会向后续节点输送大量行的节点。
  4. 确定下一步更改。

    • 缺少有选择性的访问路径:使用 django-index-design。
    • 查询形状妨碍有效使用索引:改写筛选条件、排序或连接策略。
    • 无法避免的大规模聚合:考虑使用 django-db-side-computation 或 django-materialized-views。
    • 深度偏移导致的开销:使用 django-pagination-performance。
  5. 更改后重新运行相同的执行计划。

    • 对比扫描类型、行数、排序节点、堆获取次数、缓冲区、规划时间和执行时间。

有关执行计划解读线索和前后对比审查说明,请参阅 explain-checklist.md。

安全注意事项

  • EXPLAIN ANALYZE 会执行查询。除非清楚其影响,否则不要对修改操作、不安全函数和生产环境路径使用它。
  • 顺序扫描不一定不好。当表较小或谓词会返回表中的大部分数据时,顺序扫描可能是最佳选择。
  • 使用索引也不一定好。随机堆访问、不准确的基数估算或索引后的排序仍可能成为主要开销。

验证

最后提供更改前后的执行计划摘录,并用通俗语言说明哪个节点发生了变化,以及这为何重要。

评论

支持 Markdown