我有一个复杂的查询,需要3-4秒才能执行(不能少,它可以优化)。这是分页的。但是,使用django-debug-toolbar我注意到数据库被'命中'两次。
第一个'点击'在这里:items = paginator.page(page_number)
然后稍后在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
答案 0 :(得分:2)
这不是你问题的答案,而是一些观察:
第一个查询items = paginator.page(page_number)
是获取元素的数量。我将其视为SELECT COUNT(*) FROM ....
第二个查询是查询集的实际评估(传递给分页)以检索对象。参考when querysets evaluated,在bool()
或迭代时评估查询集。因此,将在if items
评估queryset。但是当你遍历模板中的列表以列出项目时,它将被缓存并且不会再次评估。
所以似乎没有办法优化这个并减少查询。
答案 1 :(得分:1)
检查整个查询是否有任何结果。但是有不同的含义:
if paginator.count:
....
分页器总是需要按两次DB,但是这样:
同一个查询不应该两次。