浅谈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 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
python访问抓取网页常用命令总结
Apr 11 Python
python实现rsa加密实例详解
Jul 19 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
解决DataFrame排序sort的问题
Jun 07 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
python 解决函数返回return的问题
Dec 05 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
pytorch实现线性回归以及多元回归
Apr 11 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执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php处理复杂xml数据示例
2016/07/11 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
js实现随机点名
2021/01/19 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
机械工程师的岗位职责
2013/11/17 职场文书
培训班主持词
2014/03/28 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
课例研修方案
2014/05/31 职场文书
师范类求职信
2014/06/21 职场文书
七一建党日演讲稿
2014/09/05 职场文书
师德师风自查材料
2014/10/14 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
三好学生个人总结
2015/02/15 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
git中cherry-pick命令的使用教程
2022/06/25 Servers