数据删除
更新时间:2021-08-20
Doris 中的数据删除有以下几种方式:
- TRUNCATE,该命令用于直接清空表或分区,但不会删除对应的元数据。操作代价较低,再有清空数据需求时,建议使用。
- DROP,删除表或分区,会同时删除数据和元数据。
- DELETE,Delete 语句用于按条件删除数据,具体说明见本文档按条件删除一节。
- MARK DELETE,Mark Delete 功能对数据进行按行删除,具体说明见本文档标记删除一节。
本文档主要介绍 DELETE 和 BATCH DELETE 两种方式,其他方式可参阅对应的命令文档。
按条件删除
使用 DELETE
命令可以按条件删除数据。具体说明请参阅 DELETE 命令文档。下面通过示例说明:
DELETE FROM example_table WHERE event_day < 20201001 AND event_key != 1000;
DELETE FROM example_table PARTITION p202010 WHERE event_key in (1000, 1001, 1002, 1003);
DELETE 命令是一个同步命令,返回成功即代表删除成功。
用户可以通过以下命令查看历史的 DELETE 操作记录:
mysql> SHOW DELETE FROM example_db;
+-----------+---------------+---------------------+-----------------+----------+
| TableName | PartitionName | CreateTime | DeleteCondition | State |
+-----------+---------------+---------------------+-----------------+----------+
| empty_tbl | p3 | 2020-04-15 23:09:35 | k1 EQ "1" | FINISHED |
| test_tbl | p4 | 2020-04-15 23:09:53 | k1 GT "80" | FINISHED |
+-----------+---------------+---------------------+-----------------+----------+
2 rows in set (0.00 sec)
具体说明,可参阅 SHOW DELETE 命令文档。
注意事项
- DELETE 命令不适用于高频的删除操作,比如短时间内发送大量的 DELETE 命令,会严重影响底层数据合并效率以及查询效率。因为DELETE 操作本质上是存储了一个删除条件,在查询时会对每一行记录应用这个删除条件做过滤,因此当有大量删除条件时,查询效率就会降低。
- 尽量避免使用
DELETE-LOAD-DELETE-LOAD
这种交替执行的使用模式,这种模式对底层的数据合并策略非常不友好,可能会导致大量的数据未合并,导致积压。
标记删除
标记删除功能主要用于解决一些需要实时更新同步的场景。比如 同步MySQL的Binlog 数据。该方式只能应用于 UNIQUE KEY 模型的表上。具体说明,请参阅 MARK DELETE 文档。