Django数据库查询优化(二)

数据库查询优化(二)

  • 接上回写过的文章

  • 下面将会使用到的模型类

    class Article(models.Model):
        """博客文章模型类"""
        title = models.CharField(max_length=100, verbose_name="博客标题", unique=True)
        category = models.CharField(max_length=50, verbose_name="博客标签")
        pub_date = models.DateTimeField(auto_now_add=True, editable=True, verbose_name="发布时间")
        update_time = models.DateTimeField(auto_now=True, null=True, verbose_name="更新时间")
        content = models.TextField(blank=True, null=True, verbose_name="博客正文")
    
        def __str__(self):
            return self.title
    

使用QuerySet.exists()判断查询集是否为空

  • 通常情况下,我们习惯使用 if queryset来判断查询集是否为空,这样会从数据库取出查询集中的所有数据

  • 使用if queryset.exists(),只会从数据库中取一条数据。

    >>> from apps.article.models import Article
    >>> arts = Article.objects.all()
    >>> arts.exists()
    True
    >>> arts
    
    • arts.exists()执行的查询
    (0.000) SELECT (1) AS `a` FROM `article_article`  LIMIT 1; args=()
    
    • arts执行的查询
    (0.001) SELECT `article_article`.`id`, `article_article`.`title`, `article_article`.`category`, `article_article`.`pub_date`, `article_article`.`update_time`, `article_article`.`content` FROM `article_article`  LIMIT 21; args=()
    

使用QuerySet.count()获取查询集数据个数

  • 通常情况下,我们习惯于使用len()获取一个对象中的数据个数,但是len(queryset)这样会从数据库取出查询集中的所有数据。

  • 使用queryset.count(),会直接使用数据库计数函数count()来计算数据个数,当数据量较大时会节省查询时间。

    >>> from apps.article.models import Article
    >>> arts = Article.objects.all()
    >>> arts.count()
    24
    >>> len(arts)
    24
    
    • arts.count()执行的查询
    (0.001) SELECT COUNT(*) AS `__count` FROM `article_article`; args=()
    
    • len(arts)执行的查询
    (0.002) SELECT `article_article`.`id`, `article_article`.`title`, `article_article`.`category`, `article_article`.`pub_date`, `article_article`.`update_time`, `article_article`.`content` FROM `article_article`; args=()
    

使用values()或者values_list()取需要的数据列

  • 大多数,一个数据表中的数据列,我们只会用到其中的一列或者两列,这时就没有必要从数据库中查询其他列的数据,使用 quertset.values(*field)可以取指定的数据列。

    >>> from apps.article.models import Article
    >>> arts = Article.objects.all()
    >>> for art in arts.values('title'):
    ...     print(art['title'])
    ...
    基于PyMySQL的数据库连接
    Django中如何使用markdown
    Django全文检索
    ...
    >>> for art in arts:
    ...     print(art.title)
    ...
    基于PyMySQL的数据库连接
    Django中如何使用markdown
    Django全文检索
    ....
    
    • 执行的sql语句
    (0.001) SELECT `article_article`.`title` FROM `article_article`; args=()
    (0.002) SELECT `article_article`.`id`, `article_article`.`title`, `article_article`.`category`, `article_article`.`pub_date`, `article_article`.`update_time`, `article_article`.`content` FROM `article_article`; args=()
    

    小结

  • 这几种方法都没有改变查询数据库的次数,主要优化在减少从数据库中取出的数据量,以此来加快查询速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值