2016-09-06 83 views
0

我分页列表视图与许多领域的典范,所以它需要花费大量的时间来执行MyModel.objects.filter('some filter').count(),因为SQL水平运行COUNT(ID),而不是在Django

SELECT COUNT(*) FROM mytable 
COUNT(*)而不是

SELECT COUNT(id) FROM mytable 

即使我写明确

MyModel.objects.only('id').count() 

我怎样才能让Django的运行COUNT(id).count()

更新:

我正在使用PostgreSQL。

+0

你确定它会更快吗? – gavriel

+2

'count(*)'和'count(id)'之间不存在真正的性能差异。不要打扰改变,你不会获得任何东西。由于MVCC模型,'count'在postgresql上简单慢。但是,您可以快速估计行数:https://wiki.postgresql.org/wiki/Count_estimate或者您可以跟踪单独表/缓存中的行数。 – freakish

+0

我想你不会在速度上发现太多的差异,但显然是一些新的学习。 –

回答

0

尝试使用汇总查询:

from django.db import models 
MyObject.objects.all().aggregate(models.Count('id'))['id__count'] 
0

COUNT(id)大致相当于:

MyModel.objects.exclude(id=None).count() 

这将增加额外的步骤来算表中的字段,这是不是COUNT(*)

的情况下
相关问题