Партиционирование и бакетирование
Doris организует таблицу на двух уровнях: партиции разделяют строки по значению столбца, а бакеты разделяют каждую партицию на таблеты для параллельной обработки. Выбирайте схему с учётом фильтров запросов, распределения данных и требований к сроку хранения.
Базовый вариант для данных временных рядов
Для непрерывно поступающих данных временных рядов автоматическое партиционирование позволяет создавать временные партиции по мере поступления строк. В следующем примере используются дневные партиции и автоматический выбор количества бакетов.
Подключитесь через клиент MySQL с учётной записью, у которой есть права на создание баз данных и таблиц. В примере используется одна реплика, чтобы его можно было выполнить на кластере для разработки с одним BE; для рабочей среды выберите подходящее количество реплик.
CREATE DATABASE IF NOT EXISTS partition_demo;
USE partition_demo;
CREATE TABLE sales (
sale_time DATETIME NOT NULL,
order_id BIGINT NOT NULL,
amount DECIMAL(10, 2)
)
DUPLICATE KEY(sale_time, order_id)
AUTO PARTITION BY RANGE (date_trunc(sale_time, 'day')) ()
DISTRIBUTED BY HASH(order_id) BUCKETS AUTO
PROPERTIES (
"replication_num" = "1",
"estimate_partition_size" = "1G"
);
INSERT INTO sales VALUES
('2026-10-14 10:00:00', 1, 12.50),
('2026-10-15 11:00:00', 2, 20.00);
SELECT COUNT(*) AS row_count FROM sales;
+-----------+
| row_count |
+-----------+
| 2 |
+-----------+
В результате загрузки создаются две дневные партиции. BUCKETS AUTO выбирает количество бакетов на основе предполагаемого размера партиции и ресурсов кластера; размер существующих партиций при этом не изменяется. Выбирайте интервал партиционирования так, чтобы не создавать слишком много небольших партиций. Небольшие справочные таблицы, а также таблицы, которым не нужны фильтрация по времени или управление сроком хранения, могут вместо этого использовать одну партицию.
Выбор схемы
| Решение | Базовый вариант | Когда выбирать другой вариант |
|---|---|---|
| Партиционирование | Автоматическое партиционирование для создания партиций по времени или спискам значений по мере необходимости | Используйте ручное партиционирование для произвольных диапазонов, числовых диапазонов или сгруппированных значений LIST. Используйте динамическое партиционирование, если нужны создание по расписанию и скользящее временное окно. |
| Метод бакетирования | Хеширование по столбцам, которые подходят для фильтров на равенство и обеспечивают равномерное распределение данных | Случайное распределение по бакетам может уменьшить перекос данных в таблицах DUPLICATE, но не поддерживает отсечение бакетов. См. раздел Бакетирование данных. |
| Количество бакетов | BUCKETS AUTO с характерным значением estimate_partition_size | Используйте фиксированное количество, если нужен явный контроль. При выборе размера таблетов и степени параллелизма запросов учитывайте накладные расходы на управление таблетами. |
Удаление устаревших партиций
Режимы управления сроком хранения задают разные политики:
| Режим партиционирования | Параметр | Правило хранения |
|---|---|---|
| Динамическое партиционирование | dynamic_partition.start (например, -7) | Окно относительно текущего времени с учётом настроенной единицы времени и часового пояса |
| Автоматическое партиционирование (RANGE) | partition.retention_count (например, 3) | Сохраняются N последних исторических партиций по значению партиции; текущие и будущие партиции сохраняются |
Ограничение количества партиций не гарантирует ограничение срока хранения. Если данные поступают редко или давно не обновлялись, последние N исторических партиций могут быть намного старше N дней. Выбирайте временное окно, если данные должны удаляться по достижении определённого возраста.
Для таблицы из примера следующая политика сохраняет три последние исторические партиции в дополнение к текущим и будущим партициям:
ALTER TABLE partition_demo.sales SET ("partition.retention_count" = "3");
В дальнейшем планировщик FE удаляет лишние исторические партиции. Этот параметр применяется только к таблицам AUTO RANGE и не может использоваться при включённом динамическом партиционировании. Сведения о работе планировщика и ограничениях для отдельных версий, включая изменения в Doris 4.1.4, см. в разделе Автоматическое партиционирование: управление жизненным циклом.
При применении политики хранения данные удаляются. Чтобы переместить холодные данные в более дешёвое хранилище, сохранив их, используйте многоуровневое хранение.
Как это работает
Table → Partition (by column value) → Bucket (hash or random) → Tablet (shard on a BE node)
Партиции позволяют отсекать ненужные данные при выполнении запросов и управлять жизненным циклом данных. Бакеты обеспечивают параллельное чтение и запись. Подробнее о таблетах, репликах, размещении на узлах и командах администрирования см. в разделе Как работают партиционирование и бакетирование.
Дальнейшие шаги
- Автоматическое партиционирование: создание партиций по мере необходимости.
- Динамическое партиционирование: создание по расписанию и скользящие временные окна.
- Ручное партиционирование: явно заданные диапазоны и партиции по спискам значений.
- Бакетирование данных: выбор метода, ключа и количества бакетов.
- Как работают партиционирование и бакетирование: модель распределения данных.
- Распространённые проблемы: устранение проблем при проектировании партиций и бакетов.