@Krava

Big прайсы, обновлять или удалять и заново записывать?

Добрый день, столкнулись с такой проблемой как быть при постоянном обновлении больших прайсов. К сожаления опыта в такой реализации нету, есть только предположения. Суть такова, что есть прайс(ы) ~5млн и его нужно быстро обновлять (раз в 2 часа).
На данным момент используются RabbitMQ, PostgreSQL, PHP.
Механизм работает по принципу "insert +update", но очень затратно по времени.
Если изменить реализацию на:
1) update status old goods
2) insert new
3) delete old (ночью)
Как такой механизм будет вести себя, что скажете?, хочется услышать совет кто уже с таким сталкивался.
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA, contributor
Суть такова, что есть прайс(ы) ~5млн и его нужно быстро обновлять (раз в 2 часа).

Это НЕ много и совсем НЕ часто.

обновлять или удалять и заново записывать

Ложный выбор, это одна и та же операция. MVCC update = delete + insert
Но что важно - не делать update который вам действительно не нужен. Postgresql не анализирует данные в поиске пустых обновлений, update table set id = id; вам честно удвоит таблицу, хотя ничего на логическом уровне не изменится.

Профилируйте, на что реально тратите время - pg_stat_statements ответит хорошо на этот вопрос со стороны базы. Пальцем в небо - вы работаете в автокоммите и естественно 5млн пишущих операций для любой честной ACID базы - это порядком медленного IO (даже для SSD)
Ответ написан
@rPman
Вложите логику формирования цены (ту часть что меняет ее часто) в базу, в виде коэффициентов, таким образом чтобы достаточно было изменять общие из них а те что хранятся у товаров были постоянными.

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

Отличным примером является хранение в базе цен в валюте той площадки, куда вы перенаправляете ваши покупки (не верю я что все 5 миллионов это ваше локальное производство, само собой вы перепродавец), тогда достаточно вычислять обменный курс используемых валют на вашу базовую и умножать ее при выводе.

Скорее всего будут еще коэффициенты, если площадок много, каждая может вносить свои изменения в цену. И еще, если эти площадки так же выдают вычисленную цену, вам придется перепроверять все цены на вашей площадке, чтобы внезапно не получить отдельные товары по странной цене.
Ответ написан
MetaAbstract
@MetaAbstract
Разработка интерактивных функциональных прототипов
Держите прайс в редисе и проблемы не будет.
Ответ написан
Ваш ответ на вопрос

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

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