嗨我有很多从查询得到的对象,查询集尚未评估,当我将对象列表传递给paginator对象时,需要14秒才能返回paginator对象,这是因为它正在评估列表中的所有对象需要时间(击中db可能)。
在将查询集发送到paginator对象之前,我强制评估了它:
ds_objects = list(ds_objects)
猜猜现在分页在返回对象时花费了0.0秒,但问题仍然存在,现在所有时间都由ds_objects = list(ds_objects)执行,我该如何有效地做到这一点,以便我的视图响应时间减少到只有2或3秒?我还没有找到任何最佳解决方案:s
答案 0 :(得分:1)
我的猜测是JOIN(所以select_related
)对于查询速度并不重要。无论如何,当您执行values()
查询时,您实际上并不需要select_related
,因为您将获得的唯一字段是指定为values()
个参数的字段,并且无论如何它们都会被JOIN检索。
要了解为何需要这么长时间,您可以执行以下操作:
使用
打印出“raw 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
,这将在任何新部署中创建索引。