Раздел 38 · ClickHouse и аналитические базы

Транзакции и аналитика: две разные нагрузки

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Доставка «Гонец» живёт на PostgreSQL. Клиенты оформляют заказы, курьеры отмечают, что забрали и привезли, платёжный сервис списывает деньги. База справляется: каждый такой запрос занимает миллисекунды.

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

Этот раздел про то, почему так происходит и какие базы придуманы для второго вида запросов. Начнём с главного: у базы бывает две очень разные нагрузки.

Касса и бухгалтерия

Представь магазин. На кассе кассир пробивает чеки: один покупатель, один чек, пара секунд. Чеков за день тысячи, и каждый маленький. Если касса задумается на минуту, очередь взбунтуется.

В конце квартала бухгалтер садится за отчёт. Ему нужны все чеки за три месяца, но из каждого только два поля: дата и сумма. Отчёт один, и он может считаться минуту, зато прочитать придётся сотни тысяч чеков.

Кассир и бухгалтер работают с одними и теми же чеками, но делают это противоположным образом. Кассир трогает одну запись целиком и часто. Бухгалтер трогает все записи, но по паре полей и редко.

У баз данных те же две роли.

Транзакции: OLTP

OLTP (online transaction processing, обработка транзакций) это работа кассира. Приложение «Гонца» шлёт в базу запросы вроде таких:

INSERT INTO orders (customer_id, zone_id, price_rub, ...) VALUES (5021, 3, 245.00, ...);
UPDATE orders SET status = 'picked_up', picked_up_at = now() WHERE id = 41243;
SELECT * FROM orders WHERE id = 41243;

Каждый запрос трогает одну-две строки и находит их по ключу. Запросов много, сотни и тысячи в секунду. Ответ нужен за миллисекунды: клиент смотрит на экран. И главное, изменения должны быть надёжными. Если деньги списаны, заказ обязан стать оплаченным, а не застрять на полпути. Для этого базы умеют транзакции, отсюда и название нагрузки.

PostgreSQL, MySQL, SQLite созданы именно для этого. В разделе про PostgreSQL мы как раз учились на таких запросах.

урок из курса

Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.