【发布时间】:2020-01-09 12:36:15
【问题描述】:
我有一个查询需要大约 36 秒才能运行,这是不可行的,我尝试使用 select_related 和 prefetch,但结果没有改善。
这是我的查询:
job_list = Job.objects.filter(Q(hiring_manager=emp) | Q(
followers=emp)).values_list('pk', flat=True)
emp 是:
emp = Employee.objects.filter(
user=self.request.user, firm=obj).first().pk
然后我用在:
_candidates = Candidate.objects.filter(
job__in=job_list,
apply_date__range=[date_initial, date_end]
).order_by('-apply_date')
然后吃:
_candidates.count()
这个 SQL:
SQL Executed:
SELECT ...
FROM `combo_candidate` WHERE (
`combo_candidate`.`job_id` IN (
SELECT ... FROM `combo_job` U0
LEFT OUTER JOIN `combo_job_followers` U2 ON U0.`id` = U2.`job_id`
WHERE U0.`hiring_manager_id` = 9482 OR U2.`user_id` = 9482
AND `combo_candidate`.`apply_date` BETWEEN '2019-01-01 02:00:00' AND '2019-02-01 02:00:00'
)
Time
33402,8768539 ms
hiring_manager 是 Job 中的 FK,followers 是 model Job 中的 m2m
【问题讨论】:
-
这不是 this 查询集的查询,您在另一个
QuerySet中使用job_list。 -
我在
_candidates = Candidate.objects.filter( job__in=job_list, apply_date__range=[date_initial, date_end] ).order_by('-apply_date')及以后使用_candidates.count() -
@GustavoNugueira:在这里单独运行子查询可能更有意义,例如
Candidate.objects.filter(job__in=list(job_list), apply_date__range=...)。 -
哇这优化了大约 2 秒,你能给我解释一下吗?
标签: django performance django-queryset