django - django查询聚合功能慢吗?

标签 django sqlite aggregate django-queryset

我正在与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/

相关文章:

django - 将 Django 部署到服务器

python - django从同一个表同步id

当自动提交关闭时,Django 1.6 - "The outermost ' atomic' block 不能使用 savepoint = False。”

SQLite3 如何使用索引?

php - 可迭代对象的正确 phpdoc 注释?

python - 如何在不使用 for 循环的情况下注释/聚合列表中的每个项目 (Django)

mysql - 如何在我的数据库中用 SPACE 替换 "+"(加号)?

SQLite group_concat 排序

python - 用户定义的函数不适用于 Pandas

r - R 中经过修剪均值的聚合