Доставка «Гонец» живёт на 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.