Медленный запрос MySQL - возможно, проблема с индексом? - PullRequest
0 голосов
/ 16 января 2009

Итак, во-первых, вот мой запрос: ( ПРИМЕЧАНИЕ: я знаю, что SELECT * - плохая практика, я просто включил его, чтобы сделать запрос более читабельным )

SELECT pcln_cities.*,COUNT(pcln_hotels.cityid) AS hotelcount
  FROM pcln_cities
  LEFT OUTER JOIN pcln_hotels ON pcln_hotels.cityid=pcln_cities.cityid
  WHERE pcln_cities.state_name='California' GROUP BY pcln_cities.cityid
  ORDER BY hotelcount DESC
  LIMIT 5

Итак, я знаю, что для решения подобных задач вы добавляете EXPLAIN в начало запроса, но я не уверен на 100%, как прочитать результаты, поэтому вот они:

альтернативный текст http://www.andrew -g-johnson.com / query-results.JPG

Бонус указывает на ответ, который говорит мне, что искать в результатах ОБЪЯСНИТЬ

РЕДАКТИРОВАТЬ Таблицы городов имеют следующие индексы (или это индексы?)

  • CityId
  • state_name
  • и я только что добавил один с обоими, поскольку я думал, что это может помочь (не помогло)

Таблицы отелей имеют следующие индексы (или это индексы?)

  • CityId

Ответы [ 3 ]

3 голосов
/ 16 января 2009

Хм, есть что-то не очень правильное в вашем запросе. Вы используете агрегатную функцию (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 и вы фильтруете по имени города, это повысит производительность, если вы поместите индекс в этот столбец.

Короче говоря: добавление индекса по столбцам, которые вы регулярно используете для фильтрации или сортировки, может повысить производительность. (Это просто вычеркнуть, вы можете использовать это как «руководство», но каждая ситуация отличается. Иногда бывает полезно добавить индекс, который охватывает несколько столбцов. Кроме того, помните, что если вы обновляете или вставляете запись, индексы также должны быть обновлены, так что при добавлении / обновлении / удалении записей существует небольшая потеря производительности)

Еще одна вещь, которая может улучшить производительность, - это использование внутреннего соединения вместо внешнего. Я не думаю, что здесь необходимо использовать внешнее соединение.

0 голосов
/ 16 января 2009

Ваш запрос выглядит нормально. Есть ли вероятность того, что что-то еще заблокировало запись, которая вам нужна? Столы особенно большие? Я сомневаюсь, что проблема в данных, так как отелей не так много ...

Я столкнулся с похожими проблемами с MySQL. Потратив более года на настройку, исправление ошибок и думая, что я дурачок, я переключился на SQL Server Express. Те же самые запросы с точно такими же данными в SQL Server Express будут выполняться на 2-5 порядков быстрее. В MySQL, похоже, было особенно трудное время с умеренно сложными запросами (более 5 таблиц). Я думаю, что оптимизатор MySQL стал отсталым после того, как SUN купил организацию ...

0 голосов
/ 16 января 2009

Похоже, у вас нет индекса для pcln_cities.state_name или pcln_cities.cityid? Попробуйте добавить их.

Учитывая, что вы обновили свой вопрос, сказав, что у вас есть эти индексы, я могу только предположить, что в вашей базе данных в настоящее время преобладают города в Калифорнии, поэтому оптимизатор запросов решил, что будет проще выполнить сканирование таблицы. и выбросить не калифорнийские, чем использовать индекс, чтобы выбрать калифорнийские.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...