浅谈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运算符重载用法实例分析
Jun 01 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 Python
Python判断字符串是否为合法标示符操作
Sep 03 Python
python实现图片素描效果
Sep 26 Python
图神经网络GNN算法
May 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数组操作――获取数组最后一个值的方法
2015/04/14 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
JS删除数组元素的函数介绍
2013/03/27 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
Python多线程下载文件的方法
2015/07/10 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Python多线程正确用法实例解析
2020/05/30 Python
Python同时迭代多个序列的方法
2020/07/28 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
大整数数相乘的问题
2012/07/22 面试题
自荐信模版
2013/10/24 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技