删除概述
ClickHouse 中有几种删除数据的方法,每种方法都有其自身的优势和性能特点。您应该根据您的数据模型和您打算删除的数据量选择合适的方法。
| 方法 | 语法 | 何时使用 |
|---|---|---|
| 轻量级删除 | DELETE FROM [表] | 当删除少量数据时使用。行会立即从所有后续的 SELECT 查询中过滤掉,但最初仅在内部标记为已删除,而不会从磁盘中删除。 |
| 删除变异 | ALTER TABLE [表] DELETE | 当必须立即从磁盘删除数据时使用(例如,为了合规性)。会对 SELECT 性能产生负面影响。 |
| 截断表 | TRUNCATE TABLE [数据库.表] | 有效地删除表中的所有数据。 |
| 删除分区 | DROP PARTITION | 有效地删除分区中的所有数据。 |
以下是 ClickHouse 中删除数据的不同方法的总结
轻量级删除
轻量级删除会导致行立即标记为已删除,以便它们可以自动从所有后续的 SELECT 查询中过滤掉。随后删除这些已删除的行发生在自然合并周期中,从而产生较少的 I/O。因此,有可能在未指定的时期内,数据实际上并未从存储中删除,而仅标记为已删除。如果您需要保证数据已被删除,请考虑上述变异命令。
使用轻量级 DELETE 语句删除大量数据也会对 SELECT 查询性能产生负面影响。该命令也不兼容具有投影的表。
请注意,该操作使用变异来 标记已删除的行(添加一个 _row_exists 列),从而产生一些 I/O。
通常,如果可以容忍已删除的数据保留在磁盘上(例如,在非合规情况下),则应优先使用轻量级删除而不是变异。如果需要删除所有数据,则应避免这种方法。
了解更多关于 轻量级删除的信息。
删除变异
可以通过 ALTER TABLE ... DELETE 命令发出删除变异,例如:
这些命令可以同步执行(如果是非复制的,则默认情况下)或异步执行(由 mutations_sync 设置决定)。这些命令对 I/O 强度非常高,会重写与 WHERE 表达式匹配的所有部分。此过程没有原子性 - 只要准备就绪,部分就会被变异的部分替换,并且在变异期间开始执行的 SELECT 查询将看到已经变异的部分的数据以及尚未变异的部分的数据。用户可以通过 system.mutations 表跟踪进度状态。这些操作对 I/O 强度很高,应谨慎使用,因为它们会影响集群 SELECT 性能。
了解更多关于 删除变异的信息。
截断表
如果需要删除表中的所有数据,请使用以下 TRUNCATE TABLE 命令。这是一个轻量级操作。
了解更多关于 TRUNCATE TABLE的信息。
删除分区
如果您为数据指定了自定义分区键,则可以有效地删除分区。避免高基数分区。
了解更多关于 DROP PARTITION的信息。