Хм, есть что-то не очень правильное в вашем запросе.
Вы используете агрегатную функцию (count), но вы просто группируете по id.
Обычно вы должны группировать все столбцы в списке выбора, которые не являются статистической функцией.
Поскольку вы уже указали запрос, IMHO, СУБД никогда не сможет правильно определить, какие значения он должен отображать для тех столбцов, которые не являются совокупными ...
Было бы правильнее, если бы ваш запрос был написан так:
select cityname, count(*)
from city inner join hotel on hotel.city_id = city_id
group by cityname
order by count(*) desc
Если у вас нет индекса для cityName и вы фильтруете по имени города, это повысит производительность, если вы поместите индекс в этот столбец.
Короче говоря: добавление индекса по столбцам, которые вы регулярно используете для фильтрации или сортировки, может повысить производительность.
(Это просто вычеркнуть, вы можете использовать это как «руководство», но каждая ситуация отличается. Иногда бывает полезно добавить индекс, который охватывает несколько столбцов.
Кроме того, помните, что если вы обновляете или вставляете запись, индексы также должны быть обновлены, так что при добавлении / обновлении / удалении записей существует небольшая потеря производительности)
Еще одна вещь, которая может улучшить производительность, - это использование внутреннего соединения вместо внешнего. Я не думаю, что здесь необходимо использовать внешнее соединение.