zoukankan      html  css  js  c++  java
  • 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.数据库中在合适的位置建立索引。

  • 相关阅读:
    Array.sort()对象数组排序
    ES6极简数组去重 & 深拷贝
    中文字符按拼音首字母排序(转)
    浏览器常用插件 & 开发常用类库
    异步&分段处理海量数据
    线上环境window.open()新窗口被拦截(转)
    git 版本回退(转)
    CSS字体渐变 & 隐藏浏览器滚动条 & grid布局(转载)
    Python3安装使用SaltStack以及salt-api详解
    Python3之 contextlib
  • 原文地址:https://www.cnblogs.com/lifei01/p/12807822.html
Copyright © 2011-2022 走看看