141просмотров
71.2%от подписчиков
19 декабря 2025 г.
Score: 155
Продолжаем разбор движков ClickHouse!
3. CollapsingMergeTree (для контролируемых изменений)
Этот движок позволяет явно управлять обновлениями и удалениями через специальный столбец-признак (sign):
sign = 1 — добавить/актуальная версия строки
sign = -1 — удалить/старая версия строки Пример таблицы для отслеживания статусов заказов:
CREATE TABLE order_statuses
( order_id Int32, status String, updated_at DateTime, sign Int8
)
ENGINE = CollapsingMergeTree(sign)
ORDER BY (order_id, updated_at);
Как работает изменение статуса:
-- Первоначальный статус
INSERT INTO order_statuses VALUES (5001, 'pending', '2024-01-15 10:00:00', 1); -- Обновление статуса: удаляем старый, добавляем новый
INSERT INTO order_statuses VALUES (5001, 'pending', '2024-01-15 10:00:00', -1), (5001, 'shipped', '2024-01-15 14:00:00', 1);
Важно:
Как и в ReplacingMergeTree, схлопывание происходит в фоне. Для немедленного результата используйте FINAL. Особенности:
CollapsingMergeTree позволяет более контролируемо обрабатывать обновления и удаления. Например, вы можете обновить ключи сортировки, вставив старую строку с sign=-1 и новую строку с новыми ключами сортировки и sign=1. 4. AggregatingMergeTree
Этот движок автоматически вычисляет агрегаты при вставке данных, значительно ускоряя аналитические запросы.
Пример — дневная статистика пользователей:
-- Исходная таблица с активностью
CREATE TABLE user_activity
( user_id Int32, action String, duration UInt32, event_date Date
) ENGINE = MergeTree
ORDER BY (user_id, event_date); -- Материализованное представление с агрегатами
CREATE MATERIALIZED VIEW user_daily_stats
ENGINE = AggregatingMergeTree()
ORDER BY (user_id, event_date)
AS SELECT user_id, event_date, countState() as action_count, sumState(duration) as total_duration, uniqState(action) as unique_actions
FROM user_activity
GROUP BY user_id, event_date;
Как использовать агрегированные данные:
-- Вставка детальных данных
INSERT INTO user_activity VALUES (1001, 'login', 120, '2024-01-15'), (1001, 'view', 300, '2024-01-15'), (1001, 'purchase', 60, '2024-01-15'); -- Получение агрегированных результатов
SELECT user_id, event_date, countMerge(action_count) as actions, sumMerge(total_duration) as total_time, uniqMerge(unique_actions) as different_actions
FROM user_daily_stats
WHERE user_id = 1001
GROUP BY user_id, event_date;
Этот движок помогает сократить время отклика на сложные, фиксированные аналитические запросы, рассчитывая их во время записи. Семейство Log: минималистичное хранение
Эти движки максимально просты и быстры для записи, но не имеют индексов.
TinyLog — для временных данных:
CREATE TABLE temp_metrics
( metric_id UUID, value Float64, collected_at DateTime
) ENGINE = TinyLog;
Применение: Промежуточные данные ETL, кэши, временные логи. Семейство Integration: работа с внешними системами
MySQL Engine — доступ:
CREATE TABLE remote_products
( id Int32, title String, category String
)
ENGINE = MySQL('mysql-server:2206', 'shop', 'products', 'admin', 'password');
Теперь можно выполнять запросы к MySQL через ClickHouse:
SELECT * FROM remote_products WHERE category = 'electronics';
Очевидно, что ClickHouse предлагает широкий спектр вариантов движков для различных сценариев использования. MergeTree является движком по умолчанию и подходит для большинства ситуаций, но при необходимости его можно заменить другими движками, правильный выбор движка для вашей конкретной задачи может значительно повысить производительность и эффективность работы с данными. Поэтому стоит потратить время на то, чтобы понять сильные и слабые стороны каждого движка и выбрать тот, который лучше всего соответствует вашим потребностям. Ну и будем продолжать тему