Избегать мутаций
В ClickHouse, мутации относятся к операциям, которые изменяют или удаляют существующие данные в таблице - обычно с использованием ALTER TABLE ... DELETE
или ALTER TABLE ... UPDATE
. Хотя эти операторы могут казаться аналогичными стандартным SQL операциям, они принципиально отличаются на уровне реализации.
Вместо изменения строк на месте, мутации в ClickHouse являются асинхронными фоновыми процессами, которые переписывают целые части данных, затронутые изменением. Этот подход необходим из-за столбцовой, неизменяемой модели хранения ClickHouse, но он может привести к значительному вводу-выведению и расходу ресурсов.
Когда выдается мутация, ClickHouse планирует создание новых помеченных частей, оставляя оригинальные части нетронутыми до тех пор, пока новые не будут готовы. Как только они готовы, помеченные части атомарно заменяют оригиналы. Однако, поскольку операция переписывает целые части, даже незначительное изменение (например, обновление одной строки) может привести к широкомасштабным переписываниям и чрезмерной амплификации записей.
Для больших наборов данных это может вызвать значительный всплеск дискового ввода-вывода и ухудшить общую производительность кластера. В отличие от слияний, мутации не могут быть отменены после отправки и будут продолжать выполняться даже после перезапусков сервера, если не будут явно отменены - см. KILL MUTATION
.
Мутации полностью упорядочены: они применяются к данным, вставленным до того, как была выдана мутация, в то время как более свежие данные остаются затронутыми. Они не блокируют вставки, но могут пересекаться с другими активными запросами. SELECT, выполняющийся во время мутации, может читать смесь помеченных и непомеченных частей, что может привести к непоследовательным представлениям данных во время выполнения. ClickHouse выполняет мутации параллельно по частям, что может дополнительно увеличить использование памяти и CPU, особенно когда вовлечены сложные подзапросы (такие как x IN (SELECT ...)).
Как правило, избегайте частых или широкомасштабных мутаций, особенно на таблицах с высоким объемом. Вместо этого используйте альтернативные движки таблиц, такие как ReplacingMergeTree или CollapsingMergeTree, которые разработаны для более эффективной обработки исправлений данных во время выполнения запросов или во время слияний. Если мутации абсолютно необходимы, внимательно следите за ними, используя таблицу system.mutations, и используйте KILL MUTATION
, если процесс застрял или ведет себя неправильно. Неправильное использование мутаций может привести к ухудшению производительности, чрезмерной переработке хранилища и потенциальной нестабильности сервиса — следовательно, применяйте их с осторожностью и умеренно.
Для удаления данных пользователи также могут рассмотреть Легковесные удаления или управление данными через партиции, что позволяет эффективно удалять целые части.