mysql/doris如何高效删除历史数据

分区删除 (TRUNCATE PARTITION) ★首选推荐★‌

若历史数据是按时间分区(如日期、月份)存储的,这是最高效的方式。它直接删除整个分区的物理数据文件并更新元数据,避免逐行扫描和删除标记操作。

语法示例‌:TRUNCATE TABLE table_name PARTITION (p202301, p202302);

‌优势‌:秒级完成,资源消耗极低。

‌前提‌:必须预先根据时间周期建立分区。

‌使用删除标记 (Delete Sign) ★高吞吐场景推荐★‌

适用于 Unique Key 主键模型表,尤其适合需要频繁、大批量删除少量数据的场景(如 CDC 同步)。通过导入包含删除标记的数据行实现"逻辑删除"。

‌原理‌:在导入数据时指定特殊字段值(如 DORIS_DELETE_SIGN =true),系统自动合并时删除对应主键数据

‌优势‌:可与其他数据导入合并进行,效率远高于逐行执行 DELETE 语句。

‌适用场景‌:实时同步包含删除操作的 binlog 流

条件删除 (DELETE WHERE) ★精准删除时慎用★‌

传统 DELETE 语法允许按条件删除特定行数据。

sql 复制代码
‌语法示例‌:DELETE FROM table_name PARTITION partition_name WHERE create_date < '2024-01-01'; 

‌局限性‌:

是同步操作,会启动独立的删除作业

删除大量数据时,需扫描相关数据并生成大量删除标记,后续Compaction合并时才真正物理删除,资源消耗大且存在延迟

‌建议‌:仅用于删除少量、分散的历史数据,避免高频或大批量使用

整表删除 (TRUNCATE TABLE) ★清空重置时使用★‌

当需要删除表中所有数据(全部历史数据)并保留表结构时使用。

‌语法‌:TRUNCATE TABLE table_name;

‌优势‌:比逐行删除或删除所有分区更快。

‌利用临时分区实现原子覆盖写 ★重写历史数据时推荐★‌

适用于需要‌完全替换‌某个历史分区数据的场景。先在临时分区导入新数据,再用原子操作替换原有分区:

ALTER TABLE table_name REPLACE PARTITION (p202301) WITH TEMPORARY PARTITION (tp_temp);

‌优势‌:替换操作瞬间完成,避免删除旧数据和导入新数据期间的数据不可见窗口期

对于未创建分区的 Doris 表,首选方案:改造表结构添加分区

sql 复制代码
1‌.创建新分区表
CREATE TABLE new_table (
  ... -- 原表字段
) PARTITION BY RANGE(dt)( ... ) -- 按时间分区
DISTRIBUTED BY ...;
sql 复制代码
2.迁移有效数据
使用 INSERT INTO new_table SELECT ... FROM old_table WHERE dt >= '保留起始时间' 迁移需保留的数据

3.后续可直接通过 TRUNCATE PARTITION 秒级删除过期分区