首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django复杂查询命中db两次,尽管是分页的。

django复杂查询命中db两次,尽管是分页的。
EN

Stack Overflow用户
提问于 2012-10-09 13:36:48
回答 2查看 760关注 0票数 1

我有一个复杂的查询,需要3-4秒才能执行(不能再少了,它已经尽可能优化了)。这是分页的。然而,使用django-debug-toolbar时,我注意到数据库被“击中”了两次。

第一个“热门”是在这里:items = paginator.page(page_number),然后是稍后的if items:

虽然查询需要3-4秒。在这两个点上访问数据库,我得到的页面负载估计为6-7秒。

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

这是我的代码,以防万一:

代码语言:javascript
运行
复制
paginator = Paginator(tips, PAGE_ITEMS)
items = paginator.page(page_number)
if items:
    offset = items.object_list[0]
else:
    offset = None
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-09 14:48:48

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

  • 第一个查询items = paginator.page(page_number)是获取元素的数量。我把它看作SELECT COUNT(*) FROM ....
  • ,第二个查询是对查询集(传递给分页)的实际求值,以检索对象。通过引用when querysets evaluated,查询集在bool()或iterated时进行求值。因此,查询集将在if items中进行计算。但是,当您迭代模板中的列表以列出项目时,它将被缓存,并且不会再次求值。

因此,似乎没有办法优化这一点并减少查询。

票数 4
EN

Stack Overflow用户

发布于 2012-10-09 16:03:49

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

代码语言:javascript
运行
复制
if paginator.count:
    ....

分页器总是需要点击DB两次,但如下所示:

  1. 选择计数(*) ....结果被缓存在_count中。看看django源文件中的_get_count(),
  2. col1,col2,...限制N个

同一查询不应重复执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12793428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档