2012-03-01 2 views
1

Я пытаюсь извлечь идентификаторы из блогов от пользователей, которые следуют SESSIONID:Лучшая производительность в этом двухзадачном запросе?

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

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

Могу ли я лучше обслуживать соединение?

+4

Не используйте 'SELECT *' - возвращайте только те столбцы, которые вам абсолютно необходимы. Некоторое время ожидания может быть связано с добавленным сетевым трафиком посторонней информации в результатах вашего запроса. –

+1

Правда. Даже если вам нужны все столбцы, лучше указать, что вы хотите. Таким образом вы можете добавлять поля или изменять их порядок, и ваша программа все еще работает. – MPelletier

+0

Очень легко переписать его как соединение. Какие результаты вы получили с присоединением? Это все еще медленно? –

ответ

5

Вы можете быстро исправить это переписывание как:

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

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

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

+1

Да, здесь используется [коррелированный подзапрос] (http://dev.mysql.com/doc/refman/5.5/en/correlated-subqueries.html). –

+0

Аккуратный трюк. Мне нравится это! – MPelletier

3

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

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

Кроме того, чтобы проанализировать, что делает двигатель с вашим запросом, используйте Explain.

+0

+1 за упоминание индексов и предложение Объяснить. –

Смежные вопросы