Size: a a a

2021 July 05

MG

Mr. Good in Modern::Perl
В очередной раз призываю к помощи великих Гуру:) Вопрос немного оффтоп от Perl, но имхо достаточно интересный и важный.

Есть база данных из двух таблиц, по сути - это база данных товаров от разных поставщиков.

В первой хранится список товаров, в виде: ID группы, Бренд, Артикул. Связка
Бренд+Артикул - уникальная, ID группы может повторяться.

Таблица нужна для идентификации товара и для поиска аналогов товаров - все
товары с одинаковым ID группы это товары-заменители.

В этой таблице примерно 15 миллионов записей, изменения вносятся редко, т.е. в
основном таблица работает на SELECT.

Во вторую таблицу пользователи могут загрузить свои предложения, а другие пользователи делают по ней поиск. Тут может быть и много INSERTов и много SELECTов. Каждый пользователь может загрузить до 100К позиций. Размер базы находится в пределах 100 млн - 10 млрд записей. Т.е. когда пользователь делает поиск, то сайт ему показывает результаты и прямые и все предложения по товарам-аналогам. И ещё, когда пользователь загружает своё предложение, то каждая позиция проверяется по Таблице 1, что там этот товар есть, которых нет - отображаются пользователю списком после загрузки.

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

Поэтому, внимание вопрос - как это всё правильно архитектурно организовать, чтобы и поиск не пострадал, и загрузка новых предложений работала быстро.

Сейчас у меня идея такая - Nginx + Unievent::HTTP + Clickhouse. Надо ли использовать тут какую-нибудь прокладку в виде Редиса? Может, Таблицу 1 вообще полностью запихнуть в Redis? Как это максимально эффективно организовать? В общем, буду благодарен за любые идеи.
источник

DF

Denis F in Modern::Perl
Кликхаус вообще для такого не предназначен, это не замена SQL базе.  тогда уж талантул брать
источник

MG

Mr. Good in Modern::Perl
Tarantool для обеих таблиц, или только для первой? Почему не Redis?
источник

DF

Denis F in Modern::Perl
Ну из описания видно что тебе нужно эти данные хранить и гонять по ним всякие запросы. Redis это не про хранить и не про хитрые запросы.
источник

W

Warstone in Modern::Perl
Объем данных о товарах какой?
источник

MG

Mr. Good in Modern::Perl
В первой таблице около 15 миллионов строк (данные о товаре), во второй (прайс) - от 100 миллионов до 10 миллиардов строк
источник

DF

Denis F in Modern::Perl
Но вообще по описанию не очень понятно почему оно должно тормозить при достаточности железа и правильной расстановке индексов
источник

DF

Denis F in Modern::Perl
В гигабайтах то это сколько? В 128 влезет?
источник

W

Warstone in Modern::Perl
Данные о товаре в память, поиск по товарам делат ьв памяти.
источник

MG

Mr. Good in Modern::Perl
если 10 пользователей начнут загружать свои прайсы по 100К строк - начнутся тормоза, имхо даже если я всё хорошо оптимизирую, но может я и ошибаюсь
источник

MG

Mr. Good in Modern::Perl
т.е. всё в память получается?
источник

MG

Mr. Good in Modern::Perl
или только Таблицу 1?
источник

W

Warstone in Modern::Perl
Нет... Все прайсы в память не надо. Только текущий прайс для которого ищется решение.
источник

DF

Denis F in Modern::Perl
какой размер одной строки то? 1кб, 10кб, 100Мб?
источник

MG

Mr. Good in Modern::Perl
думаю в 1кб точно должна вложиться
источник

W

Warstone in Modern::Perl
Тогда из базы выбирается только текущий прайс для обработки и по нему уже все в памяти ищется.
источник

W

Warstone in Modern::Perl
А... Частота запросов к этому решению - какая?
источник

W

Warstone in Modern::Perl
Просто судя по всему тебе будет достаточно 16-32Гб оперативки для того чтобы засунуть все товары в память и по ним уже искать.
источник

W

Warstone in Modern::Perl
А базу можешь и на Pg сделать. Один индекс по прайсам по id прайса и все. Он тебе нужен чтобы выбирать конкретный прайс.
источник

DF

Denis F in Modern::Perl
так это у тебя 100Мб на прайс получается, даже на дешманском сервере все в память влезет
источник