优化django DB访问:在筛选日期范围的一个基本查询集上不同时间执行多个筛选

优化django DB访问:在筛选日期范围的一个基本查询集上不同时间执行多个筛选,django,django-models,Django,Django Models,我的观点是这样的: objectBase = MyModel.objects.filter(startDate__range=(start,end)) automatedObjects = objectBase.filter(automated = True).count() userCreatedObjects = objectBase.filter(userCreated = True).count() bookObjects = objectBase.filter(subClass = '

我的观点是这样的:

objectBase = MyModel.objects.filter(startDate__range=(start,end))
automatedObjects = objectBase.filter(automated = True).count()
userCreatedObjects = objectBase.filter(userCreated = True).count()
bookObjects = objectBase.filter(subClass = 'book').count()
pageObjects = objectBase.filter(subClass = 'page').count()
allObjectsCount = objectBase.count()
我正在使用1.2.4和最新的postgres

无论如何,我有大约20种不同的方法需要过滤按日期过滤的objectBase,我注意到每个SQL查询都按日期过滤。有没有更有效的方法使后续查询不必按日期过滤?会有速度差吗

另外,您认为什么是缓存objectBase查询的最佳方法,因为从理论上讲,它可以为过滤的日期保存数百或数千个对象,并且请求的开始日期和结束日期可能不太可能相同

比如说有人可以请求t1和t2之间的统计数据,然后再请求t3到t4,其中t1
对不起,如果这似乎是一个沉重的要求,但任何帮助将不胜感激

要减少查询数量

objectBase = MyModel.objects.filter(startDate__range=(start,end))
automated, user_created, books, pages, total = 0,0,0,0,0
for o in objectBase:
    if o.automated: automated += 1
    if o.userCreated: user_created += 1
    if o.subClass == 'book': books += 1
    if o.subClass == 'page': pages += 1
    total += 1
这将只执行一个查询,但可能会比您已经执行的查询慢,具体取决于您的SQL索引。如果您所依赖的所有字段以及日期范围都已编制索引,那么您的解决方案将非常快速。但是,我怀疑您是否对所有这些字段都进行了索引

请回答您关于缓存的问题。如果不使用相同的查询集实例,则无法轻松地缓存查询集结果。您可以尝试使用django缓存框架,但是如果您的表中有数千行,我认为缓存对您没有帮助


我的建议是,在日期范围涵盖的所有正在计算的列上创建索引。这将使您的.count查询速度极快,而无需迭代潜在的大量集合。

要减少查询数量

objectBase = MyModel.objects.filter(startDate__range=(start,end))
automated, user_created, books, pages, total = 0,0,0,0,0
for o in objectBase:
    if o.automated: automated += 1
    if o.userCreated: user_created += 1
    if o.subClass == 'book': books += 1
    if o.subClass == 'page': pages += 1
    total += 1
这将只执行一个查询,但可能会比您已经执行的查询慢,具体取决于您的SQL索引。如果您所依赖的所有字段以及日期范围都已编制索引,那么您的解决方案将非常快速。但是,我怀疑您是否对所有这些字段都进行了索引

请回答您关于缓存的问题。如果不使用相同的查询集实例,则无法轻松地缓存查询集结果。您可以尝试使用django缓存框架,但是如果您的表中有数千行,我认为缓存对您没有帮助


我的建议是,在日期范围涵盖的所有正在计算的列上创建索引。这将使您的.count查询速度极快,而无需迭代潜在的大量集合。

除非遇到一些严重的性能问题,否则您的操作方式应该很好。创建queryset objectBase不会影响数据库,因为查询尚未执行。从数据库检索所有对象并通过python/django缓存它们可能会消耗大量内存并降低性能。通过数据库/sql查询进行计数应该是获得结果的最快方法

除非您遇到一些严重的性能问题,否则您的操作方式应该很好。创建queryset objectBase不会影响数据库,因为查询尚未执行。从数据库检索所有对象并通过python/django缓存它们可能会消耗大量内存并降低性能。通过数据库/sql查询进行计数应该是获得结果的最快方法