浅谈django orm 优化


Posted in Python onAugust 18, 2018

orm优化

1.数据库技术进行优化,包括给字段加索引,设置唯一性约束等等;

2.查询过滤工作在数据库语句中做,不要放在代码中完成(看情况);

3.如果要一次查询出集合的数量,使用count函数,而不是len函数,但是如果后面还需要到集合,那就用len,因为count还需要进行一次数据库的操作;

4.避免过多的使用count和exists函数;

5.如果需要查询对象的外键,则使用外键字段而不是使用关联的外键的对象的主键;

例子:

a.b_id # 正确
a.b.id # 错误

6.在通过all语句查询时,不要做跨表查询,只查询当前表中有的数据,否则查询语句的性能会下降很多;

 比如:a表存在外键b表

a.b.all() # 错误

7.如果想要查询其他表的数据,则加上select_related(ForeignKey字段名,其实就是主动联表查询,性能也会下降),如果有多个,则在括号中加上;

8.加only参数是从查询结果中只取某个字段,而另外一个defer方法则是从查询结果中排除某个字段;

9.不要获取你不需要的东西,可以通过values和value_list实现;

values返回的是字典数组,比如:[{'key1': value1, 'key2': value2}, {'key1': value3, 'key2': value4}]
value_list返回的是tuple数组 [('value1', 'value2'), ('value3', 'value4')]
value_list+flat=True返回的是数组 ['value1', ...]

10.如果想知道是否存在至少一个结果,使用exists,而不是使用if QuerySet;但是如果后面需要用到前面的QuerySet,那就可以使用if 判断;

# Don't waste a query if you are using the queryset
books = Book.objects.filter(..)
if len(books) > 5:
 do_stuff_with_books(books)
# If you aren't using the queryset use count
books = Book.objects.filter(..)
if books.count() > 5:
 do_some_stuff()
# But never
if len(Book.objects.filter(..)) > 5:
 do_some_stuff()

11.在任何位置使用QuerySet.exists()或者QuerySet.count()都会导致额外的查询;

12.不要做无所谓的排序,排序并非没有代价,每个排序的字段都是数据库必须执行的操作;

13.如果要插入多条数据,则使用bulk_create来批量插入,减少sql查询的数量;

14.对于缓存的QuerySet对象使用with标签,可以让数据被缓存起来使用;

15.使用QuerySet.extra明确的指出要查询的字段;

16.批量的更新和删除则使用Queryset.update和delete函数,但是更新操作注意对象的缓存;

17.使用QuerySet.Iterator迭代大数据; 

当你获得一个queryset的时候,django会缓存下来,保存在内存中,如果需要对queryset进行多次的循环,那么这种缓存无可厚非; 但是如果你只需要进行一次的循环,那么其实并不需要缓存,这个使用就可以使用iterator;

比如:

for book in Books.objects.all().iterator():
  do_stuff(book)

18.如果想判断是否存在外键,只需要判断外键的id即可;

19.不要在循环中查询,而是提前取出,并且做好映射关系,这样在循环中直接通过字典的形式获取到;

20.当计算出一个QuerySet的时候,如果还需要进行多次循环的话,则可以先保留着这个缓存,但是如果只是使用一次的话,没有必要使用到缓存; 

python优化:

1.排序尽量使用 .sort(), 其中使用 key 比 cmp 效率更高

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
python获取交互式ssh shell的方法
Feb 14 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 Python
Python 里最强的地图绘制神器
Mar 01 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 Python
django连接mysql配置方法总结(推荐)
Aug 18 #Python
python画一个玫瑰和一个爱心
Aug 18 #Python
python爱心表白 每天都是浪漫七夕!
Aug 18 #Python
Python实现全排列的打印
Aug 18 #Python
python递归实现快速排序
Aug 18 #Python
pyqt5的QWebEngineView 使用模板的方法
Aug 18 #Python
python递归全排列实现方法
Aug 18 #Python
You might like
S900/ ETON E1-XM 收音机
2021/03/02 无线电
php页面缓存ob系列函数介绍
2012/10/18 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
eval的两组性能测试数据
2012/08/17 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
详解html-webpack-plugin用法全解
2018/01/22 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
Django 外键的使用方法详解
2019/07/19 Python
python @classmethod 的使用场合详解
2019/08/23 Python
将python安装信息加入注册表的示例
2019/11/20 Python
python实现文法左递归的消除方法
2020/05/22 Python
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
环卫处个人工作总结
2015/03/04 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP