浅谈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中的数据类型
May 05 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
python如何爬取个性签名
Jun 19 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
python微信好友数据分析详解
Nov 19 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
Python 操作SQLite数据库的示例
Oct 16 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
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
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Django添加feeds功能的示例
2018/08/07 Python
Python logging模块用法示例
2018/08/28 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
python+requests接口自动化框架的实现
2020/08/31 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
就业自荐信
2013/12/04 职场文书
公司2014年度工作总结
2014/12/10 职场文书
元旦主持词开场白
2015/05/29 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python