mcpField
D
django-orm-query-optimization

django-orm-query-optimization

github.com/lvtd-llc开发167 次安装7 周前更新
代码仓库

关于 django-orm-query-optimization

面向 Django 开发者的查询优化技能,帮助诊断并减少数据库查询,尤其是视图和序列化器中的 N+1 查询。它涵盖查询检查、关联对象加载策略选择和针对性回归检查。

主要功能

  1. 01测量查询数量并检查重复 SQL
  2. 02选择关联对象加载策略
  3. 03避免预取和延迟字段陷阱
  4. 04添加针对性的查询数回归检查
  5. 05比较查询、耗时和内存变化

适用场景

  1. 01减少序列化器中的 N+1 查询
  2. 02排查模板或管理页面变慢
  3. 03通过回归检查验证 ORM 优化

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lvtd-llc/skills --skill django-orm-query-optimization

安装后在 Claude Code 中输入/django-orm-query-optimization确认已加载。

附带文件references/relationship-and-column-loading.md

详细介绍

Django ORM 查询优化

将此技能用于查询次数和对象加载问题。常见目标是 N+1 模式:每个渲染的行或序列化对象都会触发额外的数据库操作。

工作流

  1. 证实查询模式。

    • 捕获慢速路径的查询次数和重复 SQL。
    • 找出触发关联查询的循环、序列化器字段、模板访问、管理后台显示项或模型属性。
  2. 选择加载策略。

    • 对单值关系使用 select_related():ForeignKey 和 OneToOneField。
    • 对多值关系使用 prefetch_related():反向 FK 和多对多关系。
    • 当关联查询集需要筛选、排序、注释或嵌套的 select_related() 时,使用 Prefetch()。
    • 不需要模型实例时,使用 values() 或 values_list()。
    • 仅当确实不会用到大型列时,才使用 only() 或 defer()。
  3. 保持访问方式一致。

    • 如果预取了 items,之后不要再调用 items.filter(...) 并期望预取缓存发挥作用。
    • 如果将 iterator() 与 prefetch_related() 一起使用,请提供 chunk_size。
    • 除非每个调用方都需要,否则不要将范围过广的预取放入默认管理器。
  4. 在有帮助时添加有针对性的回归检查。

    • 针对确切的视图或序列化器路径,断言查询次数。
    • 避免脆弱的全局查询次数测试。

示例和审查要点请参阅 relationship-and-column-loading.md。

反模式

  • 未检查内存使用情况,就给每个查询集添加 prefetch_related()。
  • 使用 only() 后又在循环中访问延迟加载的字段。
  • 优化查询集,却让序列化器方法字段继续逐行发起查询。
  • 将查询隐藏在 __str__()、模型属性、模板包含项或管理后台列表方法中。

验证

展示优化前后的查询次数和重复查询模式,以及任何运行时间或内存变化。

评论

支持 Markdown