@Sratimon1

Работа с большим объемом данных node mysql?

Задача поставлена просто, получаем от клиента одним куском 50 000 +- номеров. Проверяем есть ли они в БД и если нету то записываем. БД будет хранить по началу 10 000 000 записей каждая примерно 200 байт. Так же клиент может запросить эти 50 000 номеров. Номер уникален.
Использую node + express база mysql. ОРМ sequelize.
Вопрос в скорости выполнения этих операций. И правильной реализации.
1) Я получаю массив объектов от пользователя далее по этому массиву делаю выборку данных из mySql, нахожу номера которых нету и записываю их в бд.
Есть ли возможность составить такой SQL если нету номера то записать его, после этого вернуть id номеров ? Или есть другие предложения как сделать это быстрее ?
2) Если держать номера в оперативе, это будет быстрее, но как это реализовать ?
Просто получить ответ от бд и записать его в переменную, но при обновлении базы надо будет снова делать выбору по все базе, информация будет часто меняться.
3) Использовать что то кроме mysql. Тогда какие варианты можете предложить ?
В идеале мне надо держать одну таблицу постоянно в оперативе т.к по ней будет основная выборка / запись данных.
4) Ваши варианты. Заказчик не чем не ограничивает. В данный момент есть VPS с i7-6700 и 32gb RAM.
P.s Изучаю web в общем 9 месяцев (была база в программирование С++, C++ qt, С#). Но с БД в таких объемах не работал. В поисковике в основном лайтовые статьи для новичков. Либо серьезные ребята объясняют серьезные вещи и я не вывожу. В общем прошу помочь , кто чем сможет.
  • Вопрос задан
  • 366 просмотров
Решения вопроса 1
DarkRaven
@DarkRaven
разработка программного обеспечения
Вы не смотрели на 13.2.5.2 INSERT ... ON DUPLICATE KEY UPDATE Syntax ?

Можно вставлять записи и на конфликте вставки будет делаться UPDATE. Для 50k записей вычислять те, которых нет без предварительной загрузки их БД, как мне известно - не самый быстрый вариант.

Еще вариант, - можно, залить из в буферную (отдельная таблица для входящих данный, каждая пачка которой характеризуется уникальным идентификатором) или временную таблицу и потом обработать их уже на уровне БД, хранимыми процедурами или просто запросами, но вряд ли будет меньше операций, чем в первом случае.

UPD. Забыл написать - можно вставлять пачками, подобным образом:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
Возможно, стоит просто присмотреться присмотреться к Elastic'у
Ответ написан
Про INSERT ... ON DUPLICATE KEY UPDATE вам уже сказали. И это правильно.
Если у вас номер телефона в таблице уникальное поле и при этом не изменяемое - я бы рассмотрел вариант сделать его primary key в этой таблице.
Делать выборку по принципу select * from table where phone in (5,8,123)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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