Django查询数据库性能优化

本文探讨了如何优化Django中的数据库查询性能。通过使用select_related进行主动联表查询,减少查询次数;运用prefetch_related作为非主动联表查询的折衷方案;利用only和defer方法精细化控制查询字段,避免不必要的数据加载,从而提升查询效率。
摘要由CSDN通过智能技术生成

现在有一张记录用户信息的UserInfo数据表,表中记录了10个用户的姓名,呢称,年龄,工作等信息.

models文件

    from django.db import models
    
    class Job(models.Model):
        title=models.CharField(max_length=32)
    
    class UserInfo(models.Model):
        username=models.CharField(max_length=32)
        nickname=models.CharField(max_length=32)
        job=models.ForeignKey(to="Job",to_field="id",null=True)

数据表中记录:

1133627-20170923234640118-929947453.png

另一张数据表记录用户工作的Job表,关联用户的工作字段.

1133627-20170923234650228-1241801907.png

要查出每个用户的用户名,呢称和工作等信息

    def index(request):
        user_list=models.UserInfo.objects.all()
    
        print(user_list.query)      # 打印查询时使用的语句
        print(type(user_list))      # 打印查询结果的数据类型
    
        for user in user_list:
    
            print("%s-->%s-->%s" %(user.username,user.nickname,user.job.title))
    
        return render(request,'index.html')

打印信息:

SELECT "app01_userinfo"."id", "app01_userinfo"."username", "app01_userinfo"."nickname", "app01_userinfo"."job_id" FROM "app01_userinfo"
<class 'django.db.models.query.QuerySet'>
user1-->user1-->python
user2-->user2-->linux
user3-->user3-->golang
user4-->user4-->python
user5-->user5-->linux
user6-->user6-->golang
user7-->user7-->python
user8-->user8-->linux
user9-->user9-->golang
user10-->user10-->linux

在服务端进行这些操作,这些查询语句的性能是很低的,遍历取出这10个用户的姓名,呢称,工作等信息要在两张数据库中执行11次查询操作.

首先只从UserInfo表中查出所有的用户记录,需要执行一次查询操作.

查询Job数据表,每循环一次用户信息的列表,都需要从Job表中查询一次用户的工作信息.

数据表中总共记录了10条用户记录,所以还需要循环10次才能从Job表中查询完成所有用户的工作信息.所以一共需要执行11次数据库查询操作.

那有没有什么好的方法能够提高数据库查询的效率呢???

    def index(request):
        user_list=models.UserInfo.objects.values("username","nickname","job")
    
        print(user_list.query)      # 打印查询时使用的语
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值