跳到主要内容
跳到主要内容

概述

在 ClickHouse 中有几种删除数据的方法,每种方法都有其自身的优点和性能特点。您应该根据您的数据模型和您打算删除的数据量选择合适的方法。

方法语法何时使用
轻量级删除DELETE FROM [表]在删除少量数据时使用。行会立即从所有后续 SELECT 查询中过滤掉,但最初仅在内部标记为已删除,而不是从磁盘中删除。
删除 mutationALTER TABLE [表] DELETE当数据必须立即从磁盘删除时使用(例如,为了合规性)。会对 SELECT 性能产生负面影响。
截断表TRUNCATE TABLE [数据库.表]有效地删除表中的所有数据。
删除分区DROP PARTITION有效地删除分区中的所有数据。

以下是 ClickHouse 中删除数据的不同方法的摘要

轻量级删除

轻量级删除会导致行立即被标记为已删除,以便可以自动从所有后续 SELECT 查询中过滤掉。这些已删除行的后续删除发生在自然合并周期中,因此 I/O 较少。因此,在未指定的时间段内,数据可能实际上并未从存储中删除,而只是标记为已删除。如果您需要保证数据被删除,请考虑上述 mutation 命令。

-- delete all data from 2018 with a mutation. Not recommended.
DELETE FROM posts WHERE toYear(CreationDate) = 2018

使用轻量级 DELETE 语句删除大量数据也可能对 SELECT 查询性能产生负面影响。该命令也不兼容带有 projections 的表。

请注意,mutation 用于操作中标记已删除的行(添加 _row_exists 列),因此会产生一些 I/O。

通常,如果可以容忍磁盘上已删除数据的存在(例如,在非合规情况下),则应优先选择轻量级删除而不是 mutations。如果需要删除所有数据,仍然应避免使用此方法。

阅读更多关于轻量级删除的信息。

删除 Mutations

删除 mutations 可以通过 ALTER TABLE … DELETE 命令发出,例如

-- delete all data from 2018 with a mutation. Not recommended.
ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018

这些可以同步执行(如果是非复制表,则为默认)或异步执行(由 mutations_sync 设置确定)。这些操作非常消耗 I/O,会重写所有与 WHERE 表达式匹配的 parts。此过程没有原子性 - parts 会在准备就绪后立即替换为 mutated parts,并且在 mutation 期间开始执行的 SELECT 查询将看到来自已 mutated parts 的数据以及来自尚未 mutated parts 的数据。用户可以通过 systems.mutations 表跟踪进度状态。这些是 I/O 密集型操作,应谨慎使用,因为它们会影响集群 SELECT 性能。

阅读更多关于删除 mutations的信息。

截断表

如果需要删除表中的所有数据,请使用如下所示的 TRUNCATE TABLE 命令。这是一个轻量级操作。

TRUNCATE TABLE posts

阅读更多关于TRUNCATE TABLE的信息。

删除分区

如果您为数据指定了自定义分区键,则可以有效地删除分区。避免高基数分区。

ALTER TABLE posts (DROP PARTITION '2008')

阅读更多关于DROP PARTITION的信息。

更多资源