我有一个复杂的查询,需要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
发布于 2012-10-09 14:48:48
这不是对你问题的回答,而是一些观察结果:
items = paginator.page(page_number)
是获取元素的数量。我把它看作SELECT COUNT(*) FROM ....
bool()
或iterated时进行求值。因此,查询集将在if items
中进行计算。但是,当您迭代模板中的列表以列出项目时,它将被缓存,并且不会再次求值。因此,似乎没有办法优化这一点并减少查询。
发布于 2012-10-09 16:03:49
这将检查整个查询是否有任何结果。但有不同的含义:
if paginator.count:
....
分页器总是需要点击DB两次,但如下所示:
同一查询不应重复执行。
https://stackoverflow.com/questions/12793428
复制相似问题