欢迎来到Cecilia陈的博客

孤独,是人一生最好的修行。

13 查询优化

一、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:内部类似子查询,消耗资源在反复问数据库的次数上,但是不需要连表

img

img

posted @ 2019-10-27 16:48  Cecilia陈  阅读(135)  评论(0编辑  收藏  举报