Я предполагаю, что соединения (так что 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
, это создаст индекс в любом новом развертывании.