ORM性能相关
model:
先给一个简单的表结构
from django.db import models class User(models.Model):
username=models.CharField(max_length=32)
pwd=models.CharField(max_length=64)
pd=models.ForeignKey('Depart',on_delete=models.CASCADE) class Depart(models.Model):
title=models.CharField(max_length=32)
only
需求:在user表中获取所有的username和id
a.需求: 只取n列
queryset=[{},{}] model.User.objects.all().values('id','username') queryset=[(),()]
model.User.objects.all().values_list('id','username') queryset=[obj,obj] obj只有id和name
result=model.User.objects.all().only('id','username') for item in result:
print(item.id,item.username,item.pwd)
age没有,去数据库再查一次...for循环几次就再查几次性能很低
需要注意的是:
- 如果取了only以外的字段,虽然可以取的到,但是他内部会重新查一次表
- 如果循环取only以外的字段就会重复多次查表操作
defer
defer跟only想对应,是排除哪些字段
result=model.User.objects.all().defer('id','username')排除哪列
select_related
###连表操作,相当于主动做join
需求:获取所有人的用户和所在部门
用户表和部门表示多对一的关系
result=model.User.objects.all()
for obj in result:
print(obj.username,obj.dp.title)
上述的ORM语句性能非常差
因为for循环一次都需要跨一次表
跨表查询的性能极低!!!!!!!!!!
优化:
result=model.User.objects.all().select_related('dp')
for item in result:
print(item.name,item.dp(Fk).title)
相当于一开始就连表了,再取的时候不需要再重新跨表操作
sql:
select * from user left join depart on user.dp.id=depart.id
需要说明的是:
selected_related只支持FK,和OnetoOne
如果连表多性能也越来越差.
prefetch_related
###
多次单表操作,先查询想要的数据,
然后构建条件,如:id=[1,2,3],再查询其他表的时候,根据id做条件
###
result=User.object.all().prefetch_related('dp')
for item in result:
print(item.name,item.dp.title)
sql
#select * from user
# 通过python代码获取:所有dp_id=[1,2]
# select * from depart where id in dp_id
说明:
- 支持M2M FK One
- 2次单表查询
ORM性能相关的更多相关文章
- Django之缓存+序列化+信号+ORM性能优化+验证码
缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加 明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcach ...
- Django ORM性能优化 和 图片验证码
一,ORM性能相关 1. 关联外键, 只拿一次数据 all_users = models.User.objects.all().values('name', 'age', 'role__name') ...
- Django之缓存、信号和图片验证码、ORM性能
一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...
- python---django中orm的使用(5)数据库的基本操作(性能相关:select_related,和prefetch_related重点)(以及事务操作)
################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...
- Django的ORM那些相关操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...
- Django之ORM那些相关操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- Django ORM那些相关操作zi
Django ORM那些相关操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...
- IIS性能相关的配置、命令
IIS性能相关的配置.命令 应用程序池回收 不要使用缺省的“固定时间间隔(分钟)”:1740(即29小时),建议改为0 可以根据实际情况设置特定时间回收,比如凌晨4点 最大工作进程数 可以根据实际情况 ...
- 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
[本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 一.ORM的"三国志" 2 1,PDF.NET诞生历程 2 2,Linq2 ...
随机推荐
- osx中Grapher的使用
Grapher 是一个可创建方程图形的应用程序,因此您能够使结果可视化.您能够输入各种数学函数,以二维和三维图形方式查看它们. 您甚至能够让图形动起来.用图形制作影片文件. 打开osx中的Graphe ...
- Exposing the Outlook Password Secrets
Exposing the Outlook Password Secrets - www.SecurityXploded.comhttp://securityxploded.com/outlookpas ...
- npm -D -S -g -i 以及安装技巧
繁杂:npm install webpack 简洁:npm i webpack 重复性操作: npm i webpack npm i babel-core .... 简洁性操作: npm i webp ...
- 51nod 125乘法逆元 (扩展欧几里得)
给出2个数M和N(M < N),且M与N互质.找出一个数K满足0 < K < N且K * M % N = 1,假设有多个满足条件的.输出最小的. Input 输入2个数M, N中间用 ...
- 你真的了解装箱(Boxing)和拆箱(Unboxing)吗?
所谓装箱就是装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程.而拆箱就是反过来了.很多人可能都知道这一点,但是是否真的就很了解boxing和unboxing了呢?可以看下下 ...
- react-native 项目实战 -- 新闻客户端(4) -- 请求网络数据
1.Home.js /** * 首页 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Te ...
- 【BIEE】BI Publisher下拉菜单设置
在使用BIEE的过程中,通常会有需要根据下拉菜单所选内容进行数据展示,如下图所示: 设置参数 进入数据模型编辑界面→参数 新增参数,P_DATADATE为示例参数 参数赋值 同时点击"值列表 ...
- 事务(Transaction)概念和特性
http://baike.baidu.com/view/121511.htm 概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库 ...
- PATHINFO模式是thinkphp特有的吗?
pathinfo当然不是某个框架特有的,pathinfo严格上讲是HTTP服务器提供的一个预定义变量,在许多的框架中有一个重要的组件叫做路由器,这个组件可以通过使用pathinfo来实现. 考虑以下代 ...
- 浅谈BloomFilter【上】基本概念和实现原理
在日常生活中.包括在设计计算机软件时,我们常常要推断一个元素是否在一个集合中. 比方在字处理软件中,须要检查一个英语单词是否拼写正确(也就是要推断 它是否在已知的字典中).在 FBI. ...