Ваши индексы не соответствуют запросу. Ваш запрос сначала исключает кандидатов на основе run_at
, так что это должен быть ваш первый индекс, но это не так.
Затем следует довольно не элегантное $or
предложение. Теперь будет сложно выбрать подходящий индекс, потому что два критерия locked_at
, а один locked_by
.
Что еще хуже, существует три критерия сортировки, но они точно противоположны направлению ограничений запроса. Кроме того, вы сортируете довольно длинную строку.
По сути, я думаю, что запрос не очень хорошо разработан, он пытается достичь слишком многого за один запрос. Я не знаю, является ли delayed_jobs
каким-то модулем, но было бы намного проще, если бы правила были проще. Например, почему работник блокирует так много рабочих мест? На самом деле, я думаю, что было бы лучше, если бы вы блокировали только ту работу, над которой вы сейчас работаете, и чтобы разные работники выбирали разные типы работ для масштабирования. Рабочие могут захотеть использовать uuids вместо того, чтобы использовать свой IP-адрес и pid (с префиксом, который не добавляет энтропию и не избирательность) и т. Д.