浅谈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在hadoop上跑起来
Jan 27 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
python 接收处理外带的参数方法
Dec 03 Python
Python数据类型之Set集合实例详解
May 07 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
python创建与遍历List二维列表的方法
Aug 16 Python
Python Numpy库常见用法入门教程
Jan 16 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 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
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
js event事件的传递与冒泡处理
2009/12/06 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
Python3中的真除和Floor除法用法分析
2016/03/16 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
python hash每次调用结果不同的原因
2019/11/21 Python
Python调用C语言程序方法解析
2020/07/07 Python
python 下载文件的多种方法汇总
2020/11/17 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
英国健身专家:WIT Fitness
2021/02/09 全球购物
小区文明倡议书
2014/05/16 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
Python实现排序方法常见的四种
2021/07/15 Python
MSSQL基本语法操作
2022/04/11 SQL Server