3 таблицы MySQL присоединиться к работе, но занимает слишком много времени - PullRequest
0 голосов
/ 02 марта 2012

У меня есть 3 таблицы:

  1. районы | id, почтовый индекс, район
  2. подписка | идентификатор, идентификатор пользователя, статус, уровень
  3. профиль | id, идентификатор пользователя, zip

Я пытаюсь подсчитать количество почтовых индексов активных подписок и сгруппировать их по районам. (Я использую LEFT (), чтобы я мог включать молнии в формате ##### - ####). Запрос работает за 6,4 секунды локально, но на сервере не выводится своевременно. Что я могу сделать, чтобы ускорить это?

Я написал:

SELECT COUNT( d.zipcode ) total, d.district
FROM districts AS d
JOIN profile AS p ON d.zipcode = LEFT(p.zip, 5)
JOIN subscriptions AS s ON s.userid = p.userid
WHERE s.status = 1
GROUP BY d.district

Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Это потому, что вы используете функцию в своем соединении. Поэтому индекс не может быть использован. Почему вы сохраняете zip в профиле таблицы? Сохраните districts.id в профиле вместо zip, это имеет смысл.

РЕДАКТИРОВАТЬ: На самом деле вы не должны делать переиндексации, как предлагает Dweeves. Но вы должны добавить внешний ключ к ссылочным профилям районов.

ALTER TABLE profile ADD CONSTRAINT fk_zip_districts FOREIGN KEY (districtsId) REFERENCING districts(id);

при условии, что вы делаете, как я сказал выше.

profile | id, userId, districtsId
3 голосов
/ 02 марта 2012

создать индекс по: d.zipcode p.zip s.userid p.userid s.status

...