### Устройство обычной базы Допустим мы работаем с таблицей такой структуры: | 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) Структура хранения данных напоминает индексы в обычных базах данных. Однако между колонками нет физической связи (отдельные файлы на диске). Это позволяет значительно увеличить эффективность работы в случае чтения с диска.