加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:17:34 所属栏目:MsSql教程 来源:网络整理
导读:我听说过使用以下方面的建议: if qs.exists(): ...if qs.count(): ...try: qs[0]except IndexError: ... 从以下评论中复制:“我正在寻找一个声明,如”在MySQL和PostgreSQL中count()对于短查询来说更快,对于长查询来说,exists()更快,并且在可能的时候使用Que
我听说过使用以下方面的建议:
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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读