0 0

[django]讨论:一种提高性能的写法10

用 filter 判断 QuerySet 是否为真,一般的写法:
car = Car.objects.filter(xx=xx)
if car:
  #do...


当程序执行到 if car:这行时,orm就会向数据库发出 select 请求了,如果返回集越大,时间就会用的越多。所以可以考虑这样写:
car = Car.objects.filter(xx=xx)
if car[:1]:
  #do...

这样就算返回集为空也不会报错了。

实验准备工作:
1. settings.py中的 DEBUG=True
2. 进入 shell
from django.db import connection
def sql():
  for x in connection.queries:print x
car = Car.objects.all()
if car[:1]:print 'true'
sql()      #打印SQL语句
if car:print 'true'
sql()      #打印SQL语句

可以对比两次SQL所用的时间,注意两次对比不要写反了。
小弟对数据库了解的不多,如果写得不对,希望高手给予指点。
问题补充:
我也试验过 count ,速度要比 limit 度。当然,我这是在MYSQL 2000条记录下测试的,不知道能不能做为依据。
问题补充:
count 比 limit 慢。
问题补充:
haha,那个贴子也是我发的。总觉得aggua讨论django的人不多,所以转这里来了。
2008年11月07日 21:01

4个答案 按时间排序 按投票排序

0 0

刚找了一帖子, 和你的想法一样, 哈哈!
http://www.aggua.com/group/post/410/

2008年11月07日 22:40
0 0

我刚问了下我同事, 他说limit比count快, 哈哈!

2008年11月07日 22:32
0 0

这两个我觉得会因为不同的数据库而不同吧, 在实际应用中可以测试一下这两个速度, 哪个快就用哪个

2008年11月07日 22:28
0 0

如果只是判断QuerySet 是否为真, count()一下就可以了吧!但是我不清楚count和limit哪个效率更高!

car = Car.objects.filter(xx=xx)
if car.count() == 0:
  #do...

2008年11月07日 22:15

相关推荐

Global site tag (gtag.js) - Google Analytics