浅谈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和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
python安装与使用redis的方法
Apr 19 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
python logging.basicConfig不生效的原因及解决
Feb 20 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
Mar 07 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 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
yum命令安装php7和相关扩展
2016/07/04 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
javascript中对对层的控制
2006/12/29 Javascript
js以对象为索引的关联数组
2010/07/04 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
javascript中的面向对象
2017/03/30 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python中的random()方法的使用介绍
2015/05/15 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Python中pillow知识点学习
2018/04/30 Python
numpy数组广播的机制
2019/07/12 Python
python实现图片九宫格分割
2021/03/07 Python
python opencv实现证件照换底功能
2019/08/19 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
html5开发之viewport使用
2013/10/17 HTML / CSS
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
2014年大学生自我评价
2014/01/19 职场文书
报关专员求职信范文
2014/02/22 职场文书
司法建议书范文
2014/05/13 职场文书
阅兵口号
2014/06/19 职场文书
公司庆典欢迎词
2015/01/26 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
小学教学工作总结2015
2015/05/13 职场文书
积极心理学课程心得体会
2016/01/22 职场文书
创业计划书之甜品店
2019/09/18 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP