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 ...
随机推荐
- Codeforces #282 div 1 C Helping People 题解
CF 282 C Helping People 题解 [原题] time limit per test 2 seconds memory limit per test 512 megabytes in ...
- 如何安装Android模拟器到VM虚拟机
1 像普通安装一样找到ISO镜像文件,该镜像文件名称为"android-x86-2.2-generic.iso",该镜像文件可以从谷歌官网得到 http://code.google ...
- 安全狗两个中危提权+NET提权
1.循环加组复现 for /l %%i in (1,1,1000) do @net user admin admin /add&@ net localgroup administrators ...
- Hibernate核心类和接口具体介绍
一.hiobernate核心类和接口预览图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/fo ...
- wps如何设置文字环绕图片
wps在编辑一些文字的时候,经常会插入一些图片,但是插入图片后,文字和图片就被分离开来,整体显得没有那么美观整洁,这个时候就用到了软件的文字环绕功能,那么具体如何设置呢,接下来看教程. 首先打开wps ...
- Delphi Math里的基本函数,以及浮点数比较函数
Delphi里的好东西太多,多到让人觉得烦.这种感觉就是当年打游戏<英雄无敌3>,改了钱以后,有钱了每天都要造建筑,明明是好事,可是让人觉得烦. 先记录下来,以后再回来加强对Math单元的 ...
- Dephi泛型generic的应用
Dephi泛型generic的应用 泛型在C++, C#中已有广泛应用,Delphi自2009版本也引入泛型,典型的应用如TList,TDictionary.如果你熟悉C#,其用法十分类似. 比如 ...
- day14—JQuery编程基础
JQuery 1.什么是jQuery jQuery是一个优秀的JavaScript框架.一个轻量级的JavaScript类库.jQuery的核心理念是Write less.Do more. 使用jQu ...
- 【HBase基础教程】1、HBase之单机模式与伪分布式模式安装(转)
在这篇blog中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建hbase伪分布式环境的前提是我们已经搭建好了hadoop完全分布式环境,搭建ha ...
- MySQL 用户与权限管理
MySQL权限系统的主要功能是证实连接到一台给定主机的用户,而且赋予该用户在数据库上的相关DML,DQL权限.MySQL存取控制包括2个阶段,一是server检查是否同意你连接:二是假定你能连接,se ...