您好,我有很多从查询中获得的对象,查询集尚未评估,当我将对象列表传递给分页器对象时,花了 14 秒才返回分页器对象,这是因为它正在评估列表中的所有对象,这需要时间(可能会击中数据库)。
在将查询集发送到分页器对象之前,我强制评估了查询集,如下所示:
ds_objects = list(ds_objects)
猜猜现在分页花了 0.0 秒返回对象,但问题仍然存在,所有时间都由 ds_objects = list(ds_objects) 占用,我怎样才能有效地做到这一点,使我的视图响应时间减少到仅 2 或 3 秒?我还没有找到任何最佳解决方案:s
我的猜测是 JOIN(所以select_related
)对于查询速度并不重要。无论如何,当你做一个values()
查询你并不真正需要的select_related
因为您将获得的唯一字段是指定为的字段values()
参数,并且无论如何它们都是由 JOIN 检索的。
要了解为什么需要这么长时间,您可以执行以下操作:
打印出“原始sql”
print tbl_action_log.objects.order_by('-TicketID', '-ActionLogID').query
修改它(它实际上不是 SQL,但应该足够接近)以在 SQL 客户端中运行,就像 django 自己的一样manage.py dbshell
.
执行它,记下时间。然后执行EXPLAIN ...
(将您的查询放在点中),您可能会看到一些“全表扫描”消息
在受影响的列上向数据库表添加适当的索引,然后再次执行查询。索引大概是这样的:
CREATE INDEX idx_action_log_on_tkid_logid ON tbl_action_log (TicketID, ActionLogID);
当您对索引满意时,将其创建命令存储在文件中app/sql/modelname.sql
,这将在任何新部署中创建索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)