### Устройство обычной базы
Допустим мы работаем с таблицей такой структуры:
| type | style | color | method |
|------|-------|-------|-----------|
| 1 | 10 | 3421 | 32 |
| 2 | 4 | 543 | 43295 |
| 5 | 6 | 5235 | 82341 |
Системы баз данных хранят все данные в строках. Это значит, что где-то внутри СУБД на диске хранятся три строки с данным:
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/db1.jpg)
Что происходит, когда мы выполняем запрос такого вида:
```
SELECT * FROM table WHERE color = 542
```
База данных выполнит такую последовательность:
1. Перейти на первую строку
2. Найти колонку с именем type и ее значение
3. Сравнить с требуемым и отобрать строку, если значение подходит
4. Перейти к следующей строке
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/db2.jpg)
СУБД вынуждена будет проверить значение нужной колонки для каждой строки. Понятно, что на больших таблицах это будет работать крайне медленно.
### Устройство колоночной базы
Колоночные базы так и называются потому, что хранят данные не в строках а в колонках. Каждая колонка – это как бы отдельная таблица из одной колонки, которая хранит только свои значения. Значит у нас будет 4 колонки:
Колонка type: 1, 2, 5
Колонка style: 10, 4, 6
Колонка color: 3421, 543, 5235
Колонка method: 32, 43295, 82341
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/db3.jpg)
Чтобы выполнить запрос из примера, колоночная база данных должна проверить только значения в одной колонке:
Колонка color: 3421, 543, 5235
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/db4.jpg)
Кроме этого все данные в колоночной базе данных обычно хранятся в отсортированном виде (каждая колонка отдельно). Т.е. на самом деле наши данные будет храниться так:
Колонка type: 1, 2, 5
Колонка style: 4, 6, 10
Колонка color: 543, 3421, 5235
Колонка method: 32, 43295, 82341
И, чтобы база сама знала, где какое значение, каждая запись знает свой номер. Например, вторая запись будет храниться так:
Колонка type: 1(1), 2(2), 5(3)
Колонка style: 4(2), 6(3), 10(1)
Колонка color: 543(2), 3421(1), 5235(3)
Колонка method: 32(1), 43295(2), 82341(3)
Это позволяет эффективно выполнять запросы при участии нескольких колонок:
```
SELECT * FROM table WHERE type = 5 AND style = 6 AND color = 5235
```
В этом случае СУБД узнает номера колонок, которые подходят для условий type = 5, style = 10 и color = 543. После чего выберет номера записей, которые были найдены в каждой колонке. Это особенно эффективно работают на колонках с высокой селективностью.
В отличие от строчной СУБД в примере, колоночная выполнит всего три операции поиска по отсортированным данным для получения результата.
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/db5.jpg)
Структура хранения данных напоминает индексы в обычных базах данных. Однако между колонками нет физической связи (отдельные файлы на диске). Это позволяет значительно увеличить эффективность работы в случае чтения с диска.