Задать вопрос
sykobeats
@sykobeats
Developer

Что быстрее и менее нагруженно JOIN или WHERE IN?

Доброго времени суток уважаемые!

Есть пользователи, публикации пользователей и подписки.
Какой из запросов будет менее нагружено влиять на состояние БД mysql
Необходимо вывести на странице список публикаций моих подписок. Допустим я подписался на 2000 пользователей и хочу посмотреть их ленту. Ситуация с WHERE IN(id,id,id......) ясна и не очень нравится.
Сделал по аналогии через JOIN и тоже не нравится, в голову ничего пока не приходит...

Структура
CREATE TABLE `friends` (
  `from_id` INTEGER(11) UNSIGNED NOT NULL,
  `to_id` INTEGER(11) UNSIGNED NOT NULL,
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
) ;

CREATE TABLE `feed` (
  `user_id` BIGINT(20) UNSIGNED NOT NULL COMMENT 'пользователь',
  `type` TINYINT(3) UNSIGNED NOT NULL COMMENT '1 - публикации, 2 - фотки',
  `obj_id` BIGINT(20) DEFAULT NULL COMMENT 'id - объекта',
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'дата события',
)


Пример с JOIN
select distinct 
  `f.type`, -- тип публикации (фото/текст/.....)
  `f.obj_id`, -- id публикации
  `fs.from_id`, -- мой ID в подписках (выбираю всех юзеров за кем слежу)
from feed as f -- таблица с ID публикаций
join friends as fs on fs.from_id = f.user_id -- таблица подписок
order by `f.created_at` desc -- сортировка по дате
limit 30


Пример с IN
select distinct 
  type,
  obj_id,
  user_id,
  created_at
from feed 
where user_id in (
	select to_id from friends where from_id = :user_id
)
order by created_at desc -- сортировка по дате
limit 30


Выводятся дубли из-за JOIN , не хитрым путем избавляюсь от них с помощью distinct.
Возможно, через GROUP BY будет правильнее, но пока не вижу разницы...
  • Вопрос задан
  • 1324 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@1001001
EXPLAIN вам в помощь. Вероятно план запроса будет одинаков.
Ответ написан
Vinstrok
@Vinstrok
Веб разработчик
Сделай замер скорости выполнения скрипта)
$start = microtime(true);
// тело скрипта
echo 'Время выполнения скрипта: '.(microtime(true) - $start).' сек.'

И все будет ясно
Ответ написан
@carryx
MySQL Developer
EXISTS ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы