浅谈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中异常(Exception)的汇总
Jan 18 Python
python查询mysql,返回json的实例
Mar 26 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
使用Python横向合并excel文件的实例
Dec 11 Python
django模板结构优化的方法
Feb 28 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
python实现连连看辅助(图像识别)
Mar 25 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
详解Python设计模式之策略模式
Jun 15 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
Django-imagekit的使用详解
Jul 06 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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
9个PHP开发常用功能函数小结
2011/07/15 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
2014/07/15 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
用python与文件进行交互的方法
2018/03/01 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
关于工作经历的证明书
2014/10/11 职场文书
小学教师岗位职责
2015/04/02 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python