django complex查询命中db两次,虽然是分页的。

时间:2012-10-09 05:36:48

标签: django pagination

我有一个复杂的查询,需要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

2 个答案:

答案 0 :(得分:2)

这不是你问题的答案,而是一些观察:

  • 第一个查询items = paginator.page(page_number)是获取元素的数量。我将其视为SELECT COUNT(*) FROM ....

  • 第二个查询是查询集的实际评估(传递给分页)以检索对象。参考when querysets evaluated,在bool()或迭代时评估查询集。因此,将在if items评估queryset。但是当你遍历模板中的列表以列出项目时,它将被缓存并且不会再次评估。

所以似乎没有办法优化这个并减少查询。

答案 1 :(得分:1)

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

if paginator.count:
    ....

分页器总是需要按两次DB,但是这样:

  1. SELECT COUNT(*)....结果缓存在_count中。看一下django source中的_get_count()
  2. SELECT col1,col2,.... LIMIT N
  3. 同一个查询不应该两次。