Не видя, как индексируются ваши таблицы, трудно сказать, есть ли какие-то конкретные проблемы.Я не знаю вывод объяснения MySQL, поэтому я не собираюсь подделывать что-либо.
Однако одна вещь, которую вы МОЖЕТЕ сделать, это создать условные индексы.Например, помимо ваших общих индексов, таких как
create index rooms_by_id on rooms(room_id);
, у вас могут быть индексы, в которые уже встроены условия, что позволяет сократить число записей индекса, которые необходимо просмотреть
create index rooms_by_id_usable on rooms(room_id)
WHERE (deleted_at IS NOT NULL) and (hidden <> 0)
Если 20% ваших rooms
записей соответствуют deleted_at IS NULL and hidden <> 0)
, то этот альтернативный индекс rooms_by_id_usable
будет на 20% меньше, чем rooms_by_id
, и для его прохождения потребуется (примерно) на 20% меньше времени.
Все это зависит от оптимизатора MySQL и от того, как он решит использовать индексы и так далее.Я знаю в PostgreSQL, что это действительно очень хорошо работает.