Базы данных #
1. Виды БД и для чего их лучше использовать? #
- Реляционные БД
- Документоориентированные базы данных
- Графовые базы данных
- Ключ-значение базы данных
- Колонноориентированные базы данных
- Временные базы данных (Time-Series)
- Объектно-ориентированные базы данных
- NewSQL
Таблица сравнений
Вид БД | Примеры | Основное применение |
---|---|---|
Реляционные | MySQL, PostgreSQL | Финансы, CRM, интернет-магазины |
Документоориентированные | MongoDB, CouchDB | Гибкие структуры данных, профили пользователей |
Графовые | Neo4j, OrientDB | Анализ связей, социальные сети |
Ключ-значение | Redis, DynamoDB | Кэширование, сессии |
Колонноориентированные | Cassandra, HBase | Аналитика, большие данные |
Временные | InfluxDB, TimescaleDB | Метрики, IoT |
Объектно-ориентированные | ObjectDB | CAD, моделирование |
NewSQL | CockroachDB | Масштабируемость, транзакции |
2. Масштабирование. Как решить нехватку места на сервере? #
Тип масштабирования | Описание | Решение проблемы нехватки места |
---|---|---|
Вертикальное (Scaling Up) | Увеличение ресурсов текущего сервера: больше процессоров, памяти, дисков. | Установка новых дисков, увеличение объема оперативной памяти, переход на более мощный сервер. |
Горизонтальное (Scaling Out) | Добавление дополнительных серверов, которые работают совместно. | Разделение базы данных между несколькими серверами с использованием шардинга или кластеризации. |
Архивирование данных | Перемещение редко используемых данных в архив. | Снижение нагрузки и экономия места за счет переноса устаревших данных в отдельное хранилище. |
Использование облаков | Хранение данных в облачных системах, таких как AWS, Azure, GCP. | Масштабируемое хранилище с оплатой за используемый объем. |
Репликация данных | Создание копий базы данных на других серверах для распределения нагрузки. | Разгрузка основного сервера за счет распределения запросов на чтение. |
3. Репликация базы данных. Что это такое? #
Репликация — это процесс создания и поддержания копий базы данных на нескольких серверах.
Она используется для обеспечения отказоустойчивости, увеличения производительности и масштабируемости.
Типы репликации:
- Синхронная репликация:
- Данные копируются на реплику сразу после внесения изменений.
- Высокая консистентность, но может снижать производительность.
- Асинхронная репликация:
- Данные копируются с задержкой.
- Более производительная, но возможна временная несогласованность данных.
Преимущества:
- Увеличение отказоустойчивости.
- Балансировка нагрузки (например, чтение может выполняться с реплики).
- Географическое распределение данных для улучшения задержек.
Пример использования репликации:
- Master-Slave: Один главный сервер (
master
) обрабатывает запись, а копии (slave
) отвечают за чтение. - Master-Master: Все узлы могут записывать и читать, требуется механизм разрешения конфликтов.
4. Что такое шардирование? #
Шардирование — это метод горизонтального масштабирования базы данных, при котором данные делятся на части (шарды) и распределяются между несколькими серверами. Каждый шард содержит только часть общего набора данных и работает как отдельная база данных.
Как работает шардирование?
- Данные разбиваются по определённому ключу (например, идентификатор пользователя, географический регион).
- Каждая часть (шард) хранится на отдельном сервере или экземпляре базы данных.
- При запросе система определяет, на каком шарде находятся нужные данные, и обращается к нему.
Зачем нужно шардирование?
- Масштабируемость: Увеличение объёма данных обрабатывается добавлением новых серверов.
- Производительность: Запросы выполняются быстрее, так как каждый сервер обрабатывает только часть данных.
- Изоляция: Ошибка на одном шарде не влияет на другие.
Плюсы шардирования
- Возможность обработки больших объёмов данных.
- Уменьшение нагрузки на каждый отдельный сервер.
- Горизонтальное масштабирование, которое дешевле, чем вертикальное.
Минусы шардирования
- Сложность реализации: Требуется правильное распределение данных между шардами.
- Обслуживание: Управление несколькими серверами сложнее.
- Перераспределение данных: Если количество серверов изменяется, данные нужно перераспределить.
5. NoSQL vs SQL #
- SQL (реляционные базы данных): Структурированные таблицы с чёткой схемой данных.
- NoSQL (нереляционные базы данных): Гибкая структура для неструктурированных или полуструктурированных данных.
Таблица сравнения
Критерий | SQL (реляционные) | NoSQL (нереляционные) |
---|---|---|
Структура данных | Таблицы (строки и столбцы). | Документы, ключ-значение, графы, колонки. |
Схема | Жёсткая, требуется заранее определить. | Гибкая, можно изменять структуру данных. |
Язык запросов | SQL (стандартный язык запросов). | API или специальные запросы (например, MongoDB Query). |
Масштабируемость | Вертикальная (добавление ресурсов серверу). | Горизонтальная (добавление серверов). |
Целостность данных | Высокая (ACID-транзакции). | Может быть слабее, иногда поддерживается BASE. |
Скорость | Оптимизировано для сложных операций и JOIN. | Высокая скорость для простых операций. |
Когда использовать | Структурированные данные, сложные связи. | Гибкие, быстро меняющиеся данные. |
Примеры | MySQL, PostgreSQL, Oracle. | MongoDB, Redis, Cassandra, Neo4j. |
6. Партиционирование #
Партиционирование (Partitioning) – это разбиение большой таблицы на мелкие подтаблицы (партиции) для ускорения запросов и оптимизации работы БД.
📌 Ключевые преимущества:
✅ Быстрые запросы – обработка меньшего объема данных.
✅ Легкое управление – удаление старых данных без влияния на всю таблицу.
✅ Балансировка нагрузки – равномерное распределение данных между серверами.
✅ Уменьшение блокировок – параллельный доступ к разным партициям.
Виды партиционирования
🔹 1. Горизонтальное партиционирование (Horizontal Partitioning)
Данные разделяются по строкам, например, по дате, диапазону ID или географическому региону.
📌 Пример:
Разделение заказов (orders
) по году создания (created_at
).
orders_2022 | orders_2023 | orders_2024 |
---|---|---|
id=1, 2022-05-10 | id=5, 2023-07-12 | id=9, 2024-02-01 |
💡 Плюсы:
✔ Ускоряет выборки, работа идет только с нужной партицией.
✔ Уменьшает нагрузку на БД.
❌ Минусы:
⛔ Сложнее обновлять и поддерживать индексы.
📌 SQL (PostgreSQL):
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
created_at DATE NOT NULL
) PARTITION BY RANGE (created_at);
CREATE TABLE orders_2023 PARTITION OF orders
FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');
CREATE TABLE orders_2024 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');
🔹 2. Вертикальное партиционирование (Vertical Partitioning)
Разделение таблицы по столбцам. Данные хранятся в разных таблицах, но связаны по ID.
📌 Пример:
Разделение таблицы users
на часто и редко используемые данные.
users_main (ID, name, email) | users_details (ID, address, preferences) |
---|---|
1, “Иван”, “ ivan@mail.com” | 1, “Москва”, “Театр, книги” |
💡 Плюсы:
✔ Оптимизирует запросы (основные данные загружаются быстрее).
✔ Экономит память (холодные данные хранятся отдельно).
❌ Минусы:
⛔ Усложняет SQL-запросы (нужно делать JOIN
).
📌 SQL (MySQL):
CREATE TABLE users_main (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE users_details (
id INT PRIMARY KEY,
address VARCHAR(255),
preferences TEXT,
FOREIGN KEY (id) REFERENCES users_main(id)
);
🔹 3. Партиционирование по списку (List Partitioning)
Каждая партиция содержит определенные значения из списка.
📌 Пример:
Разделение заказов по стране клиента.
orders_usa (USA) | orders_europe (Germany, France) | orders_asia (China, India) |
---|---|---|
id=1, country=‘USA’ | id=3, country=‘Germany’ | id=7, country=‘China’ |
📌 SQL (PostgreSQL):
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
country TEXT NOT NULL
) PARTITION BY LIST (country);
CREATE TABLE orders_usa PARTITION OF orders
FOR VALUES IN ('USA');
CREATE TABLE orders_europe PARTITION OF orders
FOR VALUES IN ('Germany', 'France');
💡 Плюсы:
✔ Оптимизирует работу с данными по категориям.
❌ Минусы:
⛔ Новые категории требуют пересоздания схемы.
🔹 4. Хеш-партиционирование (Hash Partitioning)
Данные распределяются по партициям по хеш-функции (например, id % N
).
📌 Пример:
Разделение таблицы пользователей по user_id
.
users_0 (id % 3 = 0) | users_1 (id % 3 = 1) | users_2 (id % 3 = 2) |
---|---|---|
id=3, Иван | id=1, Алексей | id=2, Ольга |
📌 SQL (PostgreSQL):
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT
) PARTITION BY HASH (id);
CREATE TABLE users_0 PARTITION OF users FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE users_1 PARTITION OF users FOR VALUES WITH (MODULUS 3, REMAINDER 1);
💡 Плюсы:
✔ Равномерное распределение нагрузки.
❌ Минусы:
⛔ Невозможно предсказать, где окажется конкретная строка.
Когда применять партиционирование?
✅ Огромные таблицы (>10M записей).
✅ Частый доступ к конкретным диапазонам данных (по дате, стране и т. д.).
✅ Долгая обработка запросов – партиции помогают ускорить SELECT
.
✅ Упрощение удаления старых данных – DROP PARTITION
быстрее, чем DELETE
.
❌ Когда НЕ нужно:
⛔ Если таблица небольшая (<1M записей).
⛔ Если данные часто обновляются (UPDATE
в партициях может быть сложным).
⛔ Если БД не поддерживает партиционирование (например, MySQL InnoDB до версии 5.7).
📌 Итог
Вид партиционирования | Как делится | Когда применять? |
---|---|---|
Горизонтальное (Range) | По диапазонам (дата, ID) | Даты, ID, архивные данные |
Вертикальное (Vertical) | По столбцам | Часто/редко используемые данные |
По списку (List) | По конкретным значениям | Разделение по категориям (страны, департаменты) |
Хеш-партиционирование (Hash) | По хеш-функции | Равномерное распределение |
📢 Вывод:
- Горизонтальное партиционирование – если у вас данные по диапазонам (например, даты).
- Вертикальное – если у вас есть “холодные” и “горячие” данные.
- Список – если четкое разделение по категориям (например, страны).
- Хеш – если нужно равномерное распределение записей.