1.普通查询的缺点
1.例:现在有两张表user和show两张表,在user表中使用m作为ForeignKey与show表进行一对多关联
2.如果通过user表中的实例查找对应的show表中的数据,就必须重复发送sql请求
3.prefetch_related()和select_related()的设计目的,都是为了减少SQL查询的数量,但是实现的方式不一样
2.select_related作用
1.select_related主要针对一对一和多对一关系进行优化。
2.select_related使用SQL的JOIN的语句进行优化,通过减少SQL查询的次数进行优化、提高性能。
3.prefetch_related()作用
1.prefetch_related()主要对于多对多字段和一对多字段进行优化
2.进行两次SQL查询,将查询结果拼接成一张表放在内存中,再查询就不用发SQL请求
4.select_related与prefetch_related使用原则
1.prefetch_related()和select_related()的设计目的很相似,都是为了减少SQL查询的数量,到时实现的方式不一样
2.因为select_related()总是在单次SQL查询中解决问题,而prefetch_related()会对每个相关表进行SQL查询,因此select_related()的效率高
3.所以尽可能的用select_related()解决问题。只要再select_related()不能解决问题的时候再去想prefech_related()。
5.select_related举例说明
作用:使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化
def index(request
):
users
= models
.User
.objects
.all()
for row
in users
:
print(row
.user
,row
.ut_id
)
print(row
.ut
.name
)
users
= models
.User
.objects
.all().values
('user','pwd','ut__name')
users
= models
.User
.objects
.all().select_related
()
users
= models
.User
.objects
.all().select_related
('ut')
6、prefetch_related举例说明 作用:进行两次sql查询,将查询结果拼接成一张表
def index(request
):
users
= models
.User
.objects
.filter(id__gt
=30).prefetch_related
('ut')
users
= models
.User
.objects
.filter(id__gt
=30).prefetch_related
('ut','tu')
for row
in users
:
print(row
.user
,row
.ut_id
)