我正在使用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
变量的值
答案 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。