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.数据库中在合适的位置建立索引。

  • 相关阅读:
    Java技术之ThreadLocal的使用
    find and find_by
    vim-config
    把字符串当做js代码执行的方法
    lodop打印设计
    前端使用lodop如何获取打印状态
    lodop第三方插件的使用
    nodejs中http服务器,如何使用GET,POST请求发送数据、npm、以及一些插件的介绍
    nodejs 用http模块搭建的服务器的路由,以及路由代码的重构过程
    nodejs基础 用http模块 搭建一个简单的web服务器 响应JSON、html
  • 原文地址:https://www.cnblogs.com/lifei01/p/12807822.html
Copyright © 2011-2022 走看看