浅谈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 相关文章推荐
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 Python
Python的log日志功能及设置方法
Jul 11 Python
Python算法中的时间复杂度问题
Nov 19 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 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 $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP实现事件机制的方法
2015/07/10 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
任意位置显示html菜单
2007/02/01 Javascript
JS解密入门之凭直觉解
2008/06/25 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
python 数据的清理行为实例详解
2017/07/12 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
会计实习自我鉴定
2013/12/04 职场文书
学校岗位设置方案
2014/01/16 职场文书
促销活动方案模板
2014/02/24 职场文书
车间机修工岗位职责
2014/02/28 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
教师师德表现自我评价
2015/03/05 职场文书
我的1919观后感
2015/06/03 职场文书
学习心得体会
2019/06/20 职场文书
如何基于python实现单目三维重建详解
2022/06/25 Python