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 在MySQL上,57行: > qs:1.07 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |