浅谈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为tornado添加recaptcha验证码功能
Feb 26 Python
python requests 使用快速入门
Aug 31 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
对python中的高效迭代器函数详解
Oct 18 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
Python3基于print打印带颜色字符串
Jul 06 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
python实现网页录音效果
Oct 26 Python
python读写数据读写csv文件(pandas用法)
Dec 14 Python
浅谈Python数学建模之整数规划
Jun 23 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 正则学习实例
2008/07/30 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
ThinkPHP路由详解
2015/07/27 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
Python Socket编程入门教程
2014/07/11 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python语言基本语句用法总结
2019/06/11 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
Python双链表原理与实现方法详解
2020/02/22 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
零件设计自荐信范文
2013/11/27 职场文书
数学检讨书1000字
2014/02/24 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS