Django-ORM+喵喵CRM-慢查询的定位和优化(1)

2025-11-18

最近用把简历甩给AI,发现目前连AI提的问题都搞不定……嘚哩,继续学习吧。

其实慢查询这个问题在Mysql学习以及喵喵CRM优化时候都涉及了,但是没能有效整合起来。

Django-ORM+喵喵CRM-N+1优化 – 红茶小馆

MySQL数据库学习-进阶索引(1) – 红茶小馆

这篇文章就尝试整合一下,主要介绍慢查询以及Django里面对于慢查询的定位和解决方案。

慢查询介绍

慢查询(Slow Query)= 数据库执行时间超过预期或超过阈值的 SQL,一般会导致:

常规来说,慢查询通常来源于如下情况:

慢查询定位

(1)实际上之前也有篇文章做了个中间件,那个皆可以当半个工具。不过实际上django有特有的debug toolbar/logging【待补】

(2)线上定位:数据库有专门的慢查询日志;

(3)EXPLAIN分析执行计划,这个就很常见了,Mysql学习时候有接触。

优化手段

(1)最基础的方法——建索引! 什么WHERE\JOIN\ORDER BY统统加上索引,嘎嘎。 不过不要给更新太频繁的字段加入索引哈。

(2)使用select_related / prefetch_related,避免N+1 见上一篇文章。

(3)Redis缓存热点数据。 配置类数据、读多写少的对象、数据统计结果啥的。喵喵CRM的权限缓存也算是一种慢查询优化吧~

(4)分页优化

(5)模糊搜索优化 前缀匹配改成xxx%。 这个不多赘述,后续看看Django内部怎么实现模糊搜索的。

Django 特有的优化点【待补】

1. values() / only() / defer() 减少字段 User.objects.only("id", "username") 减少字段 = 更少 IO = 更快

2. annotate() / aggregate() 在 DB 执行统计 比Python for 循环快 1000 倍。

3. 使用 Q 对象组合查询,减少多次查询 User.objects.filter(Q(name='xx') | Q(phone='xx'))

4. 原生 SQL + 索引,解决复杂性能问题 复杂统计类 SQL 使用 raw() 或 connection.cursor()。


← 返回