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 ...
随机推荐
- Android Tabhost置于底部
方法一: <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id=&qu ...
- JAVA Eclipse如何设置编程环境字体
窗口-首选项-常规-外观-颜色和字体,文本字体
- C++ 设置文件最近修改时间
利用VS开发C++项目,经常发现修改系统时间后,每次编译过程会变得很慢,其原因就是当你把系统时间调到未来的一个时间点,然后有意或者无意编辑过一些代码文件,那么这些文件的时间戳就停留在未来. 当你把系统 ...
- C++11之右值引用(三):使用C++11编写string类以及“异常安全”的=运算符
前面两节,说明了右值引用和它的作用.下面通过一个string类的编写,来说明右值引用的使用. 相对于C++98,主要是多了移动构造函数和移动赋值运算符. 先给出一个简要的声明: class Strin ...
- Python魔法师
第一章:数据结构和算法 1.1 查找最大或者最小的n个元素 heapq 模块的两个函数 nlargest() nsmallest() import heapq nums = [1, 8, 2, 23 ...
- vue-router push
//push 方法一 对象 // this.$router.push({path:'HelloWorld2'}); //push 方法二 命名的路由 // this.$router.push({nam ...
- ORACLE截取字符串
每行显示固定字符串,截取字符串 方法一:在循环里面输出 DECLARE l_char VARCHAR2 (3000 ) := 'ORACLEEB电子商务套件SSYSTEMg ...
- shell脚本通过ping命令来获取平均延时
#!/bin/bash #设置环境变量 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" exp ...
- beyond compare 软件学习
beyond compare 软件可以实现基本的文件对比,这点和 NotePad++ 的功能一样.但是在实现文件夹与文件夹之间的对比的话,就要使用 beyond compare 进行对比,效率是成倍提 ...
- 下拉刷新Listview(8.30)
Android-PullToRefresh 1项目托管地址: https://github.com/bavariama1/Android-PullToRefresh 2 快速开始教程:https:// ...