浅谈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操作json数据的一个简单例子
Apr 17 Python
Python读写unicode文件的方法
Jul 10 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
Python爬豆瓣电影实例
Feb 23 Python
python如何让类支持比较运算
Mar 20 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
python做反被爬保护的方法
Jul 01 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
python3获取文件中url内容并下载代码实例
Dec 27 Python
Django中modelform组件实例用法总结
Feb 10 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
php中错误处理操作实例分析
2019/08/23 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
Python os模块介绍
2014/11/30 Python
Python自动连接ssh的方法
2015/03/07 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Python实现登录接口的示例代码
2017/07/21 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
举例讲解Python常用模块
2019/03/08 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
Python代码需要缩进吗
2020/07/01 Python
python中加背景音乐如何操作
2020/07/19 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
Python中return函数返回值实例用法
2020/11/19 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
什么是事务?事务有哪些性质?
2012/03/11 面试题
南京某公司笔试题
2013/01/27 面试题
期末总结的个人自我评价
2013/11/02 职场文书
小学毕业感言500字
2014/02/28 职场文书
团日活动总结报告
2014/06/25 职场文书
bose降噪耳机音能消除人声吗
2022/04/19 数码科技