sql – 在Django中,检查空查询集最有效的方法是什么?

前端之家收集整理的这篇文章主要介绍了sql – 在Django中,检查空查询集最有效的方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我听说过使用以下方面的建议:
if qs.exists():
    ...

if qs.count():
    ...

try:
    qs[0]
except IndexError:
    ...

从以下评论中复制:“我正在寻找一个声明,如”在MysqL和Postgresql中count()对于短查询来说更快,对于长查询来说,exists()更快,并且在可能的时候使用QuerySet [0]需要第一个元素,你想检查它是否存在.然而,当count()更快时,它只是稍微更快,所以建议在两者之间选择时始终使用exists().

解决方法

看起来qs.count()和qs.exists()实际上是等效的.所以我没有发现使用exists()超过count()的一个理由.后者不慢,可以用来检查存在和长度.存在()和count()都可能对MysqL中的同一个查询进行评估.

只有在实际需要该对象时才使用qs [0].如果你只是测试存在,速度会慢得多.

在Amazon SimpleDB上,40万行:

>光盘qs:325.00 usec / pass
> qs.exists():144.46 usec / pass
> qs.count()144.33 usec / pass
> qs [0]:324.98 usec / pass

MysqL上,57行:

> qs:1.07 usec / pass
> qs.exsts():1.21 usec / pass
> qs.count():1.16 usec / pass
> qs [0]:1.27 usec / pass

我为每次通过使用随机查询来降低db级缓存的风险.测试代码

import timeit

base = """
import random
from plum.bacon.models import Session
ip_addr = str(random.randint(0,256))+'.'+str(random.randint(0,256))
try:
    session = Session.objects.filter(ip=ip_addr)%s
    if session:
        pass
except:
    pass
"""

query_variatons = [
    base % "",base  % ".exists()",base  % ".count()",base  % "[0]"
    ]

for s in query_variatons:
    t = timeit.Timer(stmt=s)
    print "%.2f usec/pass" % (1000000 * t.timeit(number=100)/100000)

猜你在找的MsSQL相关文章