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