如果大型查询集的条件非常慢

时间:2019-01-19 07:51:38

标签: python django

我正在使用Python 2.7和Django 1.9.2

我正在尝试做一个条件,如果queryset不为空,将有功能。当我的查询集增加到多达56,000条记录时,我意识到了一些事情。使用该查询集的简单条件耗时将近5秒钟,但是如果我在查询集中添加.exists(),那么快。

请检查以下代码段

from record.models import Record
records = Records.objects.filter(result=0)
if records:  # this takes almost up to 5 seconds with 56,000 records
    # do stuff here

使用.exists()

from record.models import Record
records = Records.objects.filter(result=0)
if records.exists():  # very fast abd just takes milliseconds
    # do stuff here

任何解释为什么第一个这么慢?我开始认为第一个在执行records

时会循环if变量的值

1 个答案:

答案 0 :(得分:2)

无论何时运行exists(),它都会快速而快速地查询数据库。根据文档:

  

这试图以最简单,最快的方式执行查询,但是它执行的查询与普通QuerySet查询几乎相同

但是,如果直接在 IF 条件下使用查询集(或使用count()len()等),它将得到evaluated。这就是为什么它很慢。根据文档:

  

bool()。。在布尔上下文中测试QuerySet,例如使用bool()或or和and或if语句,将导致查询被执行。如果至少有一个结果,则QuerySet为True,否则为False。

此外,有关exists()的更多信息:

  

exists()对于与QuerySet中的对象成员资格以及QuerySet中是否存在任何对象有关的搜索很有用,尤其是在大型QuerySet的情况下。

但是,如果仍然要对查询集进行评估,则不建议使用exists(),因为这样做会做更多的工作。在这种情况下,您可以简单地将其用作bool(your_qset)。根据文档:

  

此外,如果还没有评估some_queryset,但是您知道它会在某个时候进行评估,那么使用some_queryset.exists()会完成更多的整体工作(一个查询是否存在,另外一个查询以后)而不是简单地使用bool(some_queryset)来检索结果,然后检查是否返回了结果。

有关更多详细信息,请检查documentation