Django orm查询优化

最近因为项目原因着手orm的查询方面优化工作,我们接口的查询速度时间长的达到十几秒才能执行完,然后根据日志分析,主要一个是单个接口请求数据库操作达到近200次,还有一个没有设置合适的索引,针对次做出初步优化:

准备工作:

  配置好django的logging配置,我们可以在console控制台可以查看每个请求或者方法下来执行了那些sql操作。还有根据connection中间件,通过connection.querys,得到请求下的执行sql的详情,及计算请求的查询次数,超过一定次数给自己预警去优化。

优化步骤:

  1: 首先注意在for循环中的sql操作,严重拖慢接口运行速度,想办法现在for循环外查询全部只对数据库操作一次然后做map映射,然后for循环中取对应的数据,ps:python虽然是解释性语言,执行效率较低,但是相对于查询数据库操作的速度还是快很多的,并且还不增加数据库的压力。

  2.select_related和prefetch_related优化

首先select_related的优化主要是做两个相关表的主动连表操作,适用于两个表是外键和一对一的关系。有人就会问orm有正向和反向跨表查询,为什么要用select_relatedl来优化呢?首先我们知道orm的查询操作是惰性查询,我们只有要用到该对象时才会去真正执行sql,然后当我们通过对象去跨表查询外键对象的属性时,orm会再执行一次sql查询,也就会导致我们常见的n+1查询问题(当然如果是取对象自己本身的属性是不会产生额外的查询的)。而select_related查询则是主动做连表操作,一次性先把外键相关的对象的值取出来了,这样就解决了之前的问题。

第二个就是prefetch_related优化了,适用于表之间多对多和多对一关系的优化,我们想法里也可以把他当成是主动的连表,这样写orm语句时会更流畅,其实为了避免连表的性能损耗等问题,它内部采用的是分多次查询加上python代码处理。

  3.数据库中在合适的位置建立索引。

原文地址:https://www.cnblogs.com/lifei01/p/12807822.html