我正在与Django合作,以了解如何处理大型数据库。我使用具有字段名称,年龄,出生日期(出生日期)和身高的数据库。该数据库大约有500000个条目。我必须找到(1)同一年龄和(2)同一年出生的人的平均身高。查询表中的聚合函数大约需要10秒钟。是平常的还是我想念什么?
对于年龄:
age = [i[0] for i in Data.objects.values_list('age').distinct()]
ht = []
for each in age:
aggr = Data.objects.filter(age=each).aggregate(ag_ht=Avg('height')
ht.append(aggr)
从多宝
age = [i[0].year for i in Data.objects.values_list('dob').distinct()]
for each in age:
aggr = Data.objects.filter(dob__contains=each).aggregate(ag_ht=Avg('height')
ht.append(aggr)
必须从dob中提取年份。它是SQLite,我不能使用__year(join)。
最佳答案
带有时间比较循环和查询集版本的完整版本
import time
from dd.models import Data
from django.db.models import Avg
from django.db.models.functions import ExtractYear
对于年龄
start = time.time()
age = [i[0] for i in Data.objects.values_list('age').distinct()]
ht = []
for each in age:
aggr = Data.objects.filter(age=each).aggregate(ag_ht=Avg('height'))
ht.append(aggr)
end = time.time()
loop_time = end - start
start = time.time()
qs = Data.objects.values('age').annotate(ag_ht=Avg('height')).order_by('age')
ht_qs = qs.values_list('age', 'ag_ht')
end = time.time()
qs_time = end - start
print loop_time / qs_time
在dob年中,可轻松重构您的版本(在年份中添加集)
start = time.time()
years = set([i[0].year for i in Data.objects.values_list('dob').distinct()])
ht_year_loop = []
for each in years:
aggr = Data.objects.filter(dob__contains=each).aggregate(ag_ht=Avg('height'))
ht_year_loop.append((each, aggr.get('ag_ht')))
end = time.time()
loop_time = end - start
start = time.time()
qs = Data.objects.annotate(dob_year=ExtractYear('dob')).values('dob_year').annotate(ag_ht=Avg('height'))
ht_qs = qs.values_list('dob_year', 'ag_ht')
end = time.time()
qs_time = end - start
print loop_time / qs_time
关于django - django查询聚合功能慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46227233/