Перейти к основному содержанию
Перейти к основному содержанию

Избегайте мутаций

В ClickHouse мутации — это операции, которые изменяют или удаляют существующие данные в таблице, обычно с помощью ALTER TABLE ... DELETE или ALTER TABLE ... UPDATE. Хотя эти операторы могут выглядеть похожими на стандартные операции SQL, по своей внутренней реализации они принципиально отличаются.

Вместо модификации строк «на месте» мутации в ClickHouse представляют собой асинхронные фоновые процессы, которые переписывают целые части данных, затронутые изменением. Такой подход необходим из‑за колоночной, неизменяемой модели хранения в ClickHouse и может приводить к значительной нагрузке на ввод‑вывод и использование ресурсов.

Когда запускается мутация, ClickHouse планирует создание новых изменённых частей, оставляя исходные части нетронутыми до тех пор, пока новые не будут готовы. Как только они готовы, изменённые части атомарно заменяют исходные. Однако, поскольку операция переписывает целые части, даже незначительное изменение (например, обновление одной строки) может привести к масштабным перезаписям и чрезмерному увеличению объёма записи.

Для больших наборов данных это может вызвать существенный всплеск дискового ввода‑вывода и ухудшить общую производительность кластера. В отличие от слияний, мутации нельзя откатить после отправки, и они будут продолжать выполняться даже после перезапуска сервера, если их явно не отменить — см. KILL MUTATION.

Monitoring the number of active or queued mutations in ClickHouse

Информацию о том, как отслеживать количество активных или поставленных в очередь мутаций, см. в следующей статье базы знаний.

Мутации являются полностью упорядоченными: они применяются к данным, вставленным до момента их отправки, тогда как более новые данные остаются нетронутыми. Они не блокируют вставки, но всё же могут перекрываться с другими выполняющимися запросами. SELECT, выполняющийся во время мутации, может читать смесь изменённых и неизменённых частей, что может приводить к неконсистентным представлениям данных во время выполнения. ClickHouse выполняет мутации параллельно по частям, что может дополнительно усилить использование памяти и CPU, особенно когда задействованы сложные подзапросы (например, x IN (SELECT ...)).

Как правило, избегайте частых или крупномасштабных мутаций, особенно на таблицах с большим объёмом данных. Вместо этого используйте альтернативные движки таблиц, такие как ReplacingMergeTree или CollapsingMergeTree, которые спроектированы для более эффективной обработки исправлений данных во время выполнения запросов или в процессе слияний. Если мутации абсолютно необходимы, тщательно отслеживайте их с помощью таблицы system.mutations и используйте KILL MUTATION, если процесс «завис» или ведёт себя некорректно. Неправильное использование мутаций может привести к снижению производительности, чрезмерным перезаписям в хранилище и потенциальной нестабильности сервиса — поэтому применяйте их осторожно и как можно реже.

Для удаления данных пользователи также могут рассмотреть использование легковесных удалений или управление данными через партиции, которые позволяют эффективно удалять целые части.