博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django orm 优化
阅读量:5085 次
发布时间:2019-06-13

本文共 1761 字,大约阅读时间需要 5 分钟。

orm优化

  1. 数据库技术进行优化,包括给字段加索引,设置唯一性约束等等;

  2. 查询过滤工作在数据库语句中做,不要放在代码中完成(看情况);

  3. 如果要一次查询出集合的数量,使用count函数,而不是len函数,但是如果后面还需要到集合,那就用len,因为count还需要进行一次数据库的操作;

  4. 避免过多的使用count和exists函数;

  5. 如果需要查询对象的外键,则使用外键字段而不是使用关联的外键的对象的主键;

例子:a.b_id # 正确a.b.id  # 错误
  1. 在通过all语句查询时,不要做跨表查询,只查询当前表中有的数据,否则查询语句的性能会下降很多;
比如:a表存在外键b表a.b.all() # 错误
  1. 如果想要查询其他表的数据,则加上select_related(ForeignKey字段名,其实就是主动联表查询,性能也会下降),如果有多个,则在括号中加上;

  2. 加only参数是从查询结果中只取某个字段,而另外一个defer方法则是从查询结果中排除某个字段;

  3. 不要获取你不需要的东西,可以通过values和value_list实现;

values返回的是字典数组,比如:[{
'key1': value1, 'key2': value2}, {
'key1': value3, 'key2': value4}]value_list返回的是tuple数组 [('value1', 'value2'), ('value3', 'value4')]value_list+flat=True返回的是数组 ['value1', ...]
  1. 如果想知道是否存在至少一个结果,使用exists,而不是使用if QuerySet;但是如果后面需要用到前面的QuerySet,那就可以使用if 判断;
#  Don't waste a query if you are using the querysetbooks = Book.objects.filter(..)if len(books) > 5:  do_stuff_with_books(books)#  If you aren't using the queryset use countbooks = Book.objects.filter(..)if books.count() > 5:  do_some_stuff()#  But neverif len(Book.objects.filter(..)) > 5:  do_some_stuff()
  1. 在任何位置使用QuerySet.exists()或者QuerySet.count()都会导致额外的查询;

  2. 不要做无所谓的排序,排序并非没有代价,每个排序的字段都是数据库必须执行的操作;

  3. 如果要插入多条数据,则使用bulk_create来批量插入,减少sql查询的数量;

  4. 对于缓存的QuerySet对象使用with标签,可以让数据被缓存起来使用;

  5. 使用QuerySet.extra明确的指出要查询的字段;

  6. 批量的更新和删除则使用Queryset.update和delete函数,但是更新操作注意对象的缓存;

  7. 使用QuerySet.Iterator迭代大数据;

当你获得一个queryset的时候,django会缓存下来,保存在内存中,如果需要对queryset进行多次的循环,那么这种缓存无可厚非; 但是如果你只需要进行一次的循环,那么其实并不需要缓存,这个使用就可以使用iterator;

比如:for book in Books.objects.all().iterator():    do_stuff(book)
  1. 如果想判断是否存在外键,只需要判断外键的id即可;

  2. 不要在循环中查询,而是提前取出,并且做好映射关系,这样在循环中直接通过字典的形式获取到;

  3. 当计算出一个QuerySet的时候,如果还需要进行多次循环的话,则可以先保留着这个缓存,但是如果只是使用一次的话,没有必要使用到缓存;

python优化:

  1. 排序尽量使用 .sort(), 其中使用 key 比 cmp 效率更高

参考:

转载于:https://www.cnblogs.com/George1994/p/9496776.html

你可能感兴趣的文章
在centos上开关tomcat
查看>>
重启rabbitmq服务
查看>>
正则表达式(进阶篇)
查看>>
无人值守安装linux系统
查看>>
【传道】中国首部淘宝卖家演讲公开课:农业本该如此
查看>>
jQuery应用 代码片段
查看>>
MVC+Servlet+mysql+jsp读取数据库信息
查看>>
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
互联网模式下我们更加应该“专注”
查看>>
myeclipse集成jdk、tomcat8、maven、svn
查看>>
查询消除重复行
查看>>
Win 10 文件浏览器无法打开
查看>>
HDU 1212 Big Number(C++ 大数取模)(java 大数类运用)
查看>>
-bash: xx: command not found 在有yum源情况下处理
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>