django对大型查询集进行分页和排序
我想在每次数据库搜索中点击数据库一次 用户可以查询数据库,然后对结果进行分页和排序 该数据库包含700个项目 django调试工具栏显示有时查询花费的时间太长 目前,我将初始搜索结果id保存在会话中,并使用它构建一个查询集来对结果进行排序和分页 我想避免这个数据库查询 我在考虑缓存queryset,这样其他用户就可以使用缓存的queryset,而不会碰到数据库 你认为这种方法怎么样? 有什么我错过的吗django对大型查询集进行分页和排序,django,Django,我想在每次数据库搜索中点击数据库一次 用户可以查询数据库,然后对结果进行分页和排序 该数据库包含700个项目 django调试工具栏显示有时查询花费的时间太长 目前,我将初始搜索结果id保存在会话中,并使用它构建一个查询集来对结果进行排序和分页 我想避免这个数据库查询 我在考虑缓存queryset,这样其他用户就可以使用缓存的queryset,而不会碰到数据库 你认为这种方法怎么样? 有什么我错过的吗 companiesID = request.session['selectedComp
companiesID = request.session['selectedCompaniesIDs']
companies = Company.objects.filter(pk__in=companiesID).order_by(type).annotate(num_users=Count('users'))
cd = create_pagination(companies, page)
PAGINATION_RESULTS_PER_PAGE = 20
def create_pagination(results, page):
paginator = Paginator(results, PAGINATION_RESULTS_PER_PAGE)
try:
res = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
res = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
res = paginator.page(paginator.num_pages)
return res
1毫秒:
选择companys\u company
id
,companys\u company
name
,
公司/公司
部门,公司/公司
,子部门
,公司/公司
,员工人数
,公司/公司
地址,
companys\u company
home\u page
,companys\u company
career\u url
,
公司\公司
城市
,公司\公司
更新日期
,
将(companys\u selectedUsercompanys
user\u id
)从中计数为num\u用户
companys\u company
LEFT OUTER JOINcompanys\u selectedUsercompanys
在(companys\u company
id
=
companys\u selectedUsercompanys
company\u id
)其中
companys\u company
id
IN(从companys\u company
中选择U0.id
U0左侧外部联接公司\u选择了启用(U0.id
=
U1.company\u id
)按U0分组。id
,U0.名称
,U0.扇区
,
U0.子部门
,U0.员工人数
,U0.地址
,U0.主页
,
U0.career\uURL
,U0.城市
,U0.更新日期
订单按空)分组依据
公司\公司
id
,公司\公司
名称
,
公司\公司
行业
,公司\公司
子行业
,
公司/公司
员工人数
,公司/公司
地址
,
companys\u company
home\u page
,companys\u company
career\u url
,
公司\公司
城市
,公司\公司
更新日期
订单
按公司\u公司
行业
ASC限额20偏移160
11142毫秒:
选择companys\u company
id
,companys\u company
name
,
公司\公司
行业
,公司\公司
子行业
,
公司/公司
员工人数
,公司/公司
地址
,
companys\u company
home\u page
,companys\u company
career\u url
,
公司\公司
城市
,公司\公司
更新日期
,
将(companys\u selectedUsercompanys
user\u id
)从中计数为num\u用户
companys\u company
LEFT OUTER JOINcompanys\u selectedUsercompanys
在(companys\u company
id
=
companys\u selectedUsercompanys
company\u id
)其中
companys\u company
id
IN(从companys\u company
中选择U0.id
U0左侧外部联接公司\u选择了启用(U0.id
=
U1.company\u id
)按U0分组。id
,U0.名称
,U0.扇区
,
U0.子部门
,U0.员工人数
,U0.地址
,U0.主页
,
U0.career\uURL
,U0.城市
,U0.更新日期
订单按空)分组依据
公司\公司
id
,公司\公司
名称
,
公司\公司
行业
,公司\公司
子行业
,
公司/公司
员工人数
,公司/公司
地址
,
companys\u company
home\u page
,companys\u company
career\u url
,
公司\公司
城市
,公司\公司
更新日期
订单
按公司\u公司
行业
ASC限额20抵销340
对于700条记录,这样一个简单的查询不应超过几毫秒。
请向我们展示两个请求(页面==1的请求和页面>1的请求)生成的原始SQL查询及其计时
你的数据库索引正常吗?您是否检查了使用DB客户端执行两个原始sql查询的时间安排?这似乎是一个已知问题。
我将选择Facebook路线,只显示下一页和上一页。如果您的数据库只有700个项目,并且每次点击页面时查询时间太长,则您的查询存在严重错误。结果会在几毫秒和几秒钟内返回。我可以;I don’我不知道是什么造成了这种变化。当我分页到第页时会发生这种情况!=1.queryset是相等的。不同的是:paginator.page(page)您可以向我们显示您的查询/过滤器吗?请不要重复问题是注释(num_users=Count('users')),这在用户分页时不会更改。最好的办法是在页面之间保留它,而不是每次都计算它?