Вопрос проверяет понимание влияния горизонтального и вертикального партиционирования таблиц на производительность запросов в базах данных.
Горизонтальная и вертикальная виртуализация (партиционирование) таблиц — это техники оптимизации баз данных, направленные на улучшение производительности запросов и управляемости данных. Они решают разные проблемы: горизонтальное партиционирование борется с большим объемом строк, а вертикальное — с избыточностью столбцов.
Таблица разбивается на несколько физических частей (партиций) по строкам, обычно на основе значения ключа (например, диапазон дат или хеш от ID). Каждая партиция хранится отдельно, что позволяет запросам с фильтром по ключу партиции сканировать только нужную часть данных.
-- Пример: партиционирование по диапазону дат
CREATE TABLE orders (
id INT,
order_date DATE,
amount DECIMAL
) PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023)
);
-- Запрос к одной партиции
SELECT * FROM orders WHERE order_date = '2021-05-10';Это ускоряет запросы с фильтрацией, упрощает архивацию старых данных и повышает параллелизм при операциях вставки. Однако неправильный выбор ключа может привести к неравномерному распределению данных и снижению производительности.
Таблица делится по столбцам: часто используемые колонки помещаются в одну таблицу, а редко используемые или большие (например, BLOB) — в другую. Это уменьшает размер строки и объем данных, считываемых с диска при типичных запросах.
-- Исходная таблица
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
bio TEXT,
avatar BLOB
);
-- Вертикальное разделение
CREATE TABLE users_main (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE users_extra (
id INT PRIMARY KEY,
bio TEXT,
avatar BLOB
);
-- Запрос к основной таблице
SELECT name, email FROM users_main WHERE id = 1;Это снижает нагрузку на ввод-вывод для запросов, не требующих всех колонок, и улучшает кэширование. Однако усложняет операции обновления и требует JOIN для получения полных данных.
Горизонтальное партиционирование эффективно для больших таблиц с четким ключом фильтрации, а вертикальное — для таблиц с широким набором колонок, где часто запрашивается лишь их часть. Выбор зависит от паттернов доступа и требований к производительности.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию