浅谈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 相关文章推荐
Linux环境下MySQL-python安装过程分享
Feb 02 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
sublime text 3配置使用python操作方法
Jun 11 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
Python读写及备份oracle数据库操作示例
May 17 Python
Python返回数组/List长度的实例
Jun 23 Python
python 处理string到hex脚本的方法
Oct 26 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
python如果快速判断数字奇数偶数
Nov 13 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
Jan 18 Python
Python count函数使用方法实例解析
Mar 23 Python
教你使用Pandas直接核算Excel中快递费用
May 12 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数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
PHP中的替代语法介绍
2015/01/09 PHP
超级退弹代码
2008/07/07 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
python实现可下载音乐的音乐播放器
2020/02/25 Python
Python requests模块session代码实例
2020/04/14 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
python切割图片的示例
2020/11/12 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
应届生服装设计自我评价
2013/09/20 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
英语教师岗位职责
2014/03/16 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
社会工作专业求职信
2014/07/15 职场文书
公证委托书
2014/08/01 职场文书
校长师德表现自我评价
2015/03/04 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
Python 中面向接口编程
2022/05/20 Python