JOIN matches USING match_id WHERE match_id = 321. Можно ли заставить кликхаус не выгружать всю таблицу в память, а отдельными запросами получить только нужную запись из matches?
P. S. Предполагается, что в match_users при выборке с match_id количество записей будет не больше 5
А пробывал джойнить запрос ?
а-ля SELECT match_id, user_id FROM match_users JOIN (SELECT * FROM matches WHERE matches.match_id = match_users.match_id) WHERE match_id = 321?
Ну если тебе нужен 321, то ты можешь matches.match_id =321
В данном случае мне действительно нужен только 321. Но есть ситуации, когда нужен подобный запрос: SELECT match_id, user_id FROM match_users JOIN matches USING match_id WHERE user_id = 1 и тогда уже начинаются проблемы
Проблемы такого рода, что при выборке по match_users.user_id в основном не более 1000 записей и быстрее их кодом в цикле обойти и получить отдельно каждый matches.match_id, чем дожидаться пока кликхаус join выполнит
Я бы сказал, что тогда у вас схема хранения не правильная. https://www.youtube.com/watch?v=y8HsXqQEyfE , не помню на какой минуте, но требуется денормализация данных если вы храните их как таблицы. Если таблица не большая, то можно попробывать словарь для неё сделать.
Спасибо, ознакомлюсь. Проблема как раз в том, что таблица уже достаточно большая (около 400 гигабайт) и выгружать её в оперативку для такого запрос дорого и долго
Ну так она же не полностью выгружается, а только требуемые столбцы.
Шутка в том, что выгружается почти полностью. Когда планировал архитектуру я ожидал, что JOIN'ы будут работать примерно таким образом: SELECT * FROM matches WHERE match_id IN (SELECT match_id FROM match_users WHERE user_id = 1) но получилось необычно)) так что буду копать, спасибо
А в чём проблема сделать из этого запроса JOIN ? Тестили IN vs JOIN на больших запросах, получили что IN вообще не выполняется :)
Да вот в том и проблема, что IN выполняется за 1 секунду, а JOIN на более мощном сервере с необходимым объёмом оперативки для выгрузки таблицы выполняется 250 секунд
вот так и надо делать - без джойнов, но на подзапросах. Почему медленно - смотрите order by таблиц. Для match_users первым должен быть user_id
Обсуждают сегодня