Лучшая производительность в этом запросе двух таблиц? - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь получить идентификаторы блогов у пользователей, за которыми следует sessionid:

SELECT * FROM articles
 WHERE id_usuario IN (SELECT toid FROM follows WHERE fromid = '$id')

Это дает мне ожидаемый результат, но производительность довольно плохая даже при небольшом количестве строк.

Буду ли я лучше обслужен с объединением?

Ответы [ 2 ]

5 голосов
/ 01 марта 2012

Вы можете быстро исправить это, переписав следующее:

SELECT * FROM articles WHERE id_usuario IN (SELECT toid FROM follows WHERE fromid = '$id' AND id_usuario = toid)

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

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

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

Даже для такого простого запроса было бы очень удивительно, если бы объединение обеспечивало более высокую производительность.

Единственное, что я могу предложить, это индекс id_usuario.

, чтобы проанализировать, что движок делает с вашим запросом, используйте Объясните .

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