1

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

2 回答 2

4

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

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

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

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

于 2012-10-09T06:48:48.340 回答
1

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

if paginator.count:
    ....

分页器总是需要两次访问数据库,但是像这样:

  1. SELECT COUNT(*) .... 结果缓存在 _count 中。看看 django 源码中的 _get_count()
  2. 选择 col1, col2, .... 限制 N

不应进行两次相同的查询。

于 2012-10-09T08:03:48.607 回答