Python 如何在django查询中优化注释?
这段代码需要55秒才能运行,有什么方法可以优化它吗?这是不可行的Python 如何在django查询中优化注释?,python,django,django-annotate,Python,Django,Django Annotate,这段代码需要55秒才能运行,有什么方法可以优化它吗?这是不可行的 job_list = Job.objects.filter(Q(hiring_manager=emp) | Q( followers=emp) | Q(conductors=emp)).values('pk') _candidates = Candidate.objects.filter( job__in=job_list, apply_date__range=[date_initial, date_end] ).order_by
job_list = Job.objects.filter(Q(hiring_manager=emp) | Q( followers=emp) | Q(conductors=emp)).values('pk')
_candidates = Candidate.objects.filter( job__in=job_list, apply_date__range=[date_initial, date_end] ).order_by('-apply_date')
start_time2 = tm.time()
_candidates_ext = _candidates.annotate(month=TruncMonth('apply_date')).values('month').annotate(jcount=Count('pk')).order_by('month')
context['candidates_total'] = len(_candidates)
#context['candidates_total'] = _candidates.count()
context['candidates_ext'] = _candidates_ext
print("--- %s seconds ---" % (tm.time() - start_time2))
print("===== Connections =====")
print(len(connection.queries))
import pdb; pdb.set_trace()
我是这家公司的新员工,希望有一个良好的开端
使用python 2.7和DJango 1.8
编辑
我在apply date中添加了db_index=True,这有助于我,该行的运行时间为0.04秒:
_candidates_ext = _candidates.annotate(month=TruncMonth('apply_date')).values('month').annotate(jcount=Count('pk')).order_by('month')
但这些作业大约需要35秒
这是我的printconnection.querys
我在我的终端上收到:
/home/jobconvo/.virtualenvs/combo/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1393: RuntimeWarning: DateTimeField Candidate.status_date received a naive datetime (2019-02-01 00:00:00) while time zone support is active.
RuntimeWarning)
Edit2:此Sql已执行:
SQL Executed
SELECT ••• FROM `combo_candidate` WHERE (`combo_candidate`.`job_id` IN (SELECT ••• FROM `combo_job` V0 LEFT OUTER JOIN `combo_job_followers` V2 ON (V0.`id` = V2.`job_id`) LEFT OUTER JOIN `combo_job_conductors` V4 ON (V0.`id` = V4.`job_id`) WHERE (V0.`hiring_manager_id` = (SELECT ••• FROM `company_employee` U0 WHERE (U0.`firm_id` = 5705 AND U0.`user_id` = 9482)) OR V2.`user_id` = (SELECT ••• FROM `company_employee` U0 WHERE (U0.`firm_id` = 5705 AND U0.`user_id` = 9482)) OR V4.`user_id` = (SELECT ••• FROM `company_employee` U0 WHERE (U0.`firm_id` = 5705 AND U0.`user_id` = 9482)))) AND `combo_candidate`.`apply_date` BETWEEN '2019-01-01 02:00:00' AND '2019-02-01 02:00:00')
Time
45410,722971 ms
在底部的那个导入做了什么?只需断开代码并只计算这个函数只需断开代码并只计算这个函数你是什么意思?你的apply_date列被索引了吗?你能添加django生成的查询以便我们看一下吗?还请记住,在django ORM中执行group by之前,您应该order_by以清除order by子句,否则可能会产生不良结果。
SQL Executed
SELECT ••• FROM `combo_candidate` WHERE (`combo_candidate`.`job_id` IN (SELECT ••• FROM `combo_job` V0 LEFT OUTER JOIN `combo_job_followers` V2 ON (V0.`id` = V2.`job_id`) LEFT OUTER JOIN `combo_job_conductors` V4 ON (V0.`id` = V4.`job_id`) WHERE (V0.`hiring_manager_id` = (SELECT ••• FROM `company_employee` U0 WHERE (U0.`firm_id` = 5705 AND U0.`user_id` = 9482)) OR V2.`user_id` = (SELECT ••• FROM `company_employee` U0 WHERE (U0.`firm_id` = 5705 AND U0.`user_id` = 9482)) OR V4.`user_id` = (SELECT ••• FROM `company_employee` U0 WHERE (U0.`firm_id` = 5705 AND U0.`user_id` = 9482)))) AND `combo_candidate`.`apply_date` BETWEEN '2019-01-01 02:00:00' AND '2019-02-01 02:00:00')
Time
45410,722971 ms