dzheka3d
@dzheka3d

Сколько может быть значений во WHERE IN()?

Всем привет!
В документации не говорится о каких либо ограничениях на количество значений во WHERE IN().
Но может я столкнусь с какими-то подводными камнями если буду использовать такую конструкцию, например для поиска пользователей, на которых подписан юзер?
На сколько тяжела эта конструкция? Может при большом количестве значений я положу БД?

Например у меня пока получается такой запрос:
SELECT al.`mode`, al.`mode_id` 
FROM `agregate_lenta` al 
LEFT JOIN `blogs` bl ON bl.`id` = al.`mode_id` AND al.`mode` = 'blogs'
LEFT JOIN `logs` l ON l.`id` = al.`mode_id` AND al.`mode` = 'logs'
WHERE (bl.`status` IN(1,2) OR l.`status` IN (1,2)) AND (bl.`user_id` IN (411451209,411451206,411451188,411451207)) OR (l.`user_id` IN (2141183,85,1))


Но если пользователь подпишется скажем на 10тыс блогов, то последний IN будет содержать 10тыс ID
  • Вопрос задан
  • 1009 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В MySQL есть ограничение на максимальную длину запроса, определяется переменной max_allowed_packet.
А зачем в этом запросе IN, не проще сразу сделать JOIN с таблицей подписок?
Ответ написан
petermzg
@petermzg
Самый лучший программист
Если пользователь подпишется на 10 тыс. блогов, то вы явно ID будете уже хранить в отдельной таблице и запрос примет вид:
WHERE (bl.`status` IN(1,2)) AND (bl.`user_id` IN (select id from <Table>))


Ограничение есть только на длину sql запроса, и то ее устанавливаете в конфиге MySQL параметром "max_allowed_packet".

Тяжесть конструкции зависит от того насколько оптимально вы создали индексы на таблицу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы