首页 > 其他 > 详细

13 查询优化--only与defer

时间:2019-10-27 17:51:13      阅读:92      评论:0      收藏:0      [点我收藏+]

一、update() 和 save() 区别

两者都是对数据的修改保存操作,但是save()函数是将数据列的全部数据项全部重新写一遍,而update()则是针对修改的项进行针对的更新效率高耗时少

所以以后对数据的修改保存用update()

二、only 与 defer

defer和only互为反关系

  • only:

    only是只查该字段 直接将结果封装到返回给你的对象中
    点该字段 不需要再走数据库
    但如果你点了不是括号内的字段  就会频繁的去走数据库查询
  • defer

    defer是查除了该字段的 所有字段 直接将结果封装到返回给你的对象中
    点该其他字段 不需要再走数据库
    但如果你点了不是括号内的字段  就会频繁的去走数据库查询
# only
res = models.Book.objects.only('name')    # 只查name字段,
for r in res:
    # print(r.name)   # 返回name
    print(r.price)  # 查询的结果没有,因此要每次都去查

# defer
res = models.Book.objects.defer("name") # 查除了name字段之外的字段,只走一次数据库
for r in res:
    # print(r.name)   # 查询的结果没有,没有的额时候会去走数据库
    print(r.price)

三、select_related 和prefrech_related

def select_related(self, *fields)
    性能相关:表之间进行join连表操作,一次性获取关联的数据。

    总结:
    1. select_related主要针一对一和多对一关系进行优化。
    2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。

def prefetch_related(self, *lookups)
    性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。

    总结:
    1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。
    2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。

总结:

select_related:内部自动连表,消耗资源就在连表上,但是不用多次访问数据库

prefetch_related:内部类似子查询,消耗资源在反复问数据库的次数上,但是不需要连表

技术分享图片

技术分享图片

13 查询优化--only与defer

原文:https://www.cnblogs.com/xichenHome/p/11748024.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!