OLTP и OLAP
Накратко: OLTP са многото малки заявки на едно приложение, като касата, а OLAP са малкото големи заявки на отчетите, които четат всички редове.
Проблем
Касата и счетоводството
Базата на магазина върши две много различни работи наведнъж. Клиентът на касата пита за една поръчка и иска отговор веднага. Собственикът в понеделник сутрин пита „колко продадохме по месеци и по категории“, и за това трябват всички поръчки от годината.
Първите са хиляди на минута, малки и по ключ. Вторите са няколко на ден, но всяка чете всичко. Една и съща база рядко е добра и в двете. Затова съществуват различни видове бази, и този модул е за тях.
Идеята
OLTP: много малки заявки
OLTP (online transaction processing) е работата на касата: прочети или промени няколко реда, които знаеш по ключ. Продуктите в поръчка 42:
Планът показва, че базата не чете цялата таблица. Тя търси (SEARCH) по индекса на първичния ключ и стига направо до двата реда:
OLTP заявките и пишат. Покупката е една транзакция: поръчката, редът в нея и наличността се записват заедно или изобщо не се записват:
Пробвай
Клиентът пита
Клиентът се обажда за поръчка 15. Покажи статуса и датата ѝ (колони status и ordered_at).
Решение
SELECT status, ordered_at FROM orders WHERE id = 15;WHERE id = 15: номерът на поръчката е първичният ключ, и базата стига направо до реда. customer_id = 15 търси поръчките на клиент 15, а това е друг въпрос. Проверката гледа и плана: заявка, която чете цялата таблица, не минава.
Идеята
OLAP: малко големи заявки
OLAP (online analytical processing) е работата на анализа: да събереш, групирай и сравни много редове. Оборотът по месеци за 2026 година:
Тук ключ не помага. Трябват всички редове на поръчките, затова планът започва със SCAN:
При 152 реда това е мигновено. При 50 милиона реда отчетът чете гигабайти и минути наред натоварва диска, паметта и процесора. През това време касата чака. А индекс не помага, защото отчетът така или иначе иска всичко.
Идеята
Складът за данни
Решението е отчетите да не пипат базата на сайта. Всяка нощ програма копира данните в отделна база за анализи, наречена склад за данни (data warehouse). Копирането се казва ETL: extract (извади), transform (преобразувай), load (зареди).
При преобразуването таблиците обикновено се сливат в една широка: всичко за една продажба в един ред. Това е денормализация, която в базата на сайта би била грешка: името на продукта се повтаря във всеки ред. Тук е нарочно, защото данните само се четат и отчетът няма нужда от JOIN. CREATE TABLE … AS SELECT прави нова таблица от резултата на заявка:
Отменените поръчки са махнати още при копирането, така че отчетите не трябва да помнят за тях.
По-точно, за любопитните
Истинските складове за данни (ClickHouse, BigQuery, Snowflake, Amazon Redshift) пазят данните по колони, а не по редове. Отчет за оборота чете само колоните day, category и amount и прескача останалите. За това е урокът за колонните бази. Широката таблица обикновено е „таблица на фактите“ (fact table) с малки таблици-речници около нея (измерения: дата, продукт, магазин), и цялото се нарича звездна схема.
Пробвай
Отчет по категории
От таблицата sales: оборотът по категории за 2026 година (колони category и revenue, закръглен до цент), от най-голямия надолу.
Решение
SELECT category, ROUND(SUM(amount), 2) AS revenue
FROM sales
WHERE day >= '2026-01-01'
GROUP BY category
ORDER BY revenue DESC;SUM(amount) с GROUP BY category и WHERE day >= '2026-01-01'. Без условието за годината сумата е за цялото време, от септември 2025. В sales няма JOIN: категорията вече е в реда.
Упражнение
Колко поръчки по градове
От таблицата sales: колко поръчки има от всеки град (колони city и orders), от най-много надолу, при равни по име на града. Клиент без град е ред с NULL.
Решение
SELECT city, COUNT(DISTINCT order_id) AS orders
FROM sales
GROUP BY city
ORDER BY orders DESC, city;COUNT(DISTINCT order_id). В широката таблица всеки ред е един продукт от поръчка, и поръчка с три продукта е три реда. COUNT(*) брои редовете и дава 50 за София, а поръчките са 23. Това е най-честата грешка с широки таблици.
Идеята
Видът на данните и видът на въпроса
OLTP и OLAP са първото разделение. Останалите идват от това какви са данните и какво питаш за тях. Всеки урок в модула е една такава двойка, и в повечето има симулатор на истинската база в браузъра:
| Данните и въпросът | Вид база | Примери |
|---|---|---|
| Взимам по ключ, бързо, често | key-value | Redis, Valkey, DynamoDB |
| Цял документ с вложени части | документна | MongoDB |
| Какво се е случило и в какъв ред | поток от събития | Kafka, Redpanda |
| Кой с кого е свързан, през колко стъпки | графова | Neo4j |
| Суми върху милиони редове, по време | колонна, времеви редове | ClickHouse, TimescaleDB |
| Думи в текст | пълнотекстово търсене | Elasticsearch, OpenSearch |
| Подобно по смисъл | векторна | pgvector, Qdrant |
| Повече данни и заявки от един сървър | клъстер | репликация, шардинг |
Накрая е урокът как се избира. Отговорът почти винаги е: релационна база за истината и друг вид до нея само за въпроса, в който тя е слаба.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: ACID: всичко или нищо · BEGIN, COMMIT, ROLLBACK · Индекси · EXPLAIN: планът на заявката
- Продължава в: Key-value и кешът · Графови бази · Колонни и времеви бази · Как се избира база
- Задачи по темата: Видове бази данни