django复杂查询两次命中数据库,尽管已分页。

django复杂查询两次命中数据库,尽管已分页。,django,pagination,Django,Pagination,我有一个复杂的查询,需要3-4秒才能执行,不能少,它尽可能优化。这是分页的。然而,使用django调试工具栏,我注意到数据库被“命中”了两次 第一个“命中”在这里:items=paginator.pagepage_编号,然后稍后在if items: 尽管查询需要3-4秒。在这两点上点击数据库,我估计页面负载为6-7秒 这正常吗?我是否可以避免两个“命中”并仅在一个数据库“命中”中检索分页项 这是我的代码,以备请求: paginator = Paginator(tips, PAGE_ITEMS)

我有一个复杂的查询,需要3-4秒才能执行,不能少,它尽可能优化。这是分页的。然而,使用django调试工具栏,我注意到数据库被“命中”了两次

第一个“命中”在这里:items=paginator.pagepage_编号,然后稍后在if items:

尽管查询需要3-4秒。在这两点上点击数据库,我估计页面负载为6-7秒

这正常吗?我是否可以避免两个“命中”并仅在一个数据库“命中”中检索分页项

这是我的代码,以备请求:

paginator = Paginator(tips, PAGE_ITEMS)
items = paginator.page(page_number)
if items:
    offset = items.object_list[0]
else:
    offset = None

这不是对你问题的回答,而是一些观察结果:

第一个查询items=paginator.pagepage_number用于获取元素的计数。我将其视为从…中选择计数*

第二个查询是对传递给分页以检索对象的queryset的实际计算。参考,查询集在bool或迭代时进行计算。因此,queryset将在if项上进行评估。但当您在模板中迭代列表以列出项目时,它将被缓存,并且不会再次求值


因此,似乎没有办法对此进行优化并减少查询。

这不是对您问题的回答,而是一些观察结果:

第一个查询items=paginator.pagepage_number用于获取元素的计数。我将其视为从…中选择计数*

第二个查询是对传递给分页以检索对象的queryset的实际计算。参考,查询集在bool或迭代时进行计算。因此,queryset将在if项上进行评估。但当您在模板中迭代列表以列出项目时,它将被缓存,并且不会再次求值


因此,似乎没有办法对此进行优化并减少查询。

这将检查整个查询是否有任何结果。但有不同的含义:

if paginator.count:
    ....
分页器始终需要命中DB两次,但如下所示:

选择计数*。。。。结果缓存在_count中。看看django源代码中的get_count 选择col1、col2、。。。。极限N
同一个查询不应进行两次。

这将检查整个查询是否有任何结果。但有不同的含义:

if paginator.count:
    ....
分页器始终需要命中DB两次,但如下所示:

选择计数*。。。。结果缓存在_count中。看看django源代码中的get_count 选择col1、col2、。。。。极限N
同一查询不应进行两次。

否。第二次从B中选择A时,第一次是从B中选择A的选择计数*从B中选择A。唯一的区别是对象的计数否。第二次查询是从B中选择A,而第一次查询是从B中选择A中选择计数*。唯一的区别是对象的计数