浅谈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 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
python自动zip压缩目录的方法
Jun 28 Python
Python实现的概率分布运算操作示例
Aug 14 Python
Python实现求两个csv文件交集的方法
Sep 06 Python
python实现感知器算法(批处理)
Jan 18 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
python实现坦克大战
Apr 24 Python
matplotlib部件之套索Lasso的使用
Feb 24 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
Javascript 面向对象 继承
2010/05/13 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
Python编写百度贴吧的简单爬虫
2015/04/02 Python
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
详细分析python3的reduce函数
2017/12/05 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
override和overload的区别
2016/03/09 面试题
GC是什么?为什么要有GC?
2013/12/08 面试题
校园学雷锋活动月总结
2014/03/09 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
施工现场安全管理制度
2015/08/05 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电