mysql drop partition和truncate partition有什么区别

时间:2019-05-21 18:52:05

标签: mysql partitioning

有人可以解释以下命令之间的区别吗?

ALTER TABLE A DROP PARTITION p0;

ALTER TABLE A TRUNCATE PARTITION p0;

在哪些情况下我们应该使用DROP / TRUNCATE分区?

3 个答案:

答案 0 :(得分:1)

两者都将数据丢弃。而且它不是“事务性的”,因此您无法使用ROLLBACK恢复数据。

DROP PARTITION还会从分区列表中删除该分区。

TRUNCATE PARTITION将分区留在原处,但为空。

DROP PARTITION的常见用法是删除“旧”行。考虑一张仅需保留90天的信息表。使用PARTITION BY RANGE(TO_DAYS(...))并每周进行分区。然后,每周DROP最旧的分区,ADD一个新的分区。 here有更多讨论。

我没有看到需要TRUNCATE

请注意,很少有用例可以从PARTITIONing中受益。到目前为止,我发现仅用于PARTITION BY RANGE

答案 1 :(得分:0)

在表上有LIST分区时,对分区进行伸缩将是一个不错的选择。 它将删除属于LIST分区的所有行,但不会从表结构中删除分区条目。

答案 2 :(得分:0)

假设您想在 MySQL 表中存储信用卡交易/订单等。由于数据量很大,您可能需要对其进行分区。假设您已根据交易月份对表进行分区。

PARTITION BY RANGE ( month(transactionDate))
(PARTITION p0 VALUES LESS THAN (2) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (3) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (4) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (5) ENGINE = InnoDB,
 PARTITION p4 VALUES LESS THAN (6) ENGINE = InnoDB,
 PARTITION p5 VALUES LESS THAN (7) ENGINE = InnoDB,
 PARTITION p6 VALUES LESS THAN (8) ENGINE = InnoDB,
 PARTITION p7 VALUES LESS THAN (9) ENGINE = InnoDB,
 PARTITION p8 VALUES LESS THAN (10) ENGINE = InnoDB,
 PARTITION p9 VALUES LESS THAN (11) ENGINE = InnoDB,
 PARTITION p10 VALUES LESS THAN (12) ENGINE = InnoDB,
 PARTITION p11 VALUES LESS THAN (13) ENGINE = InnoDB,
 PARTITION p12 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ |

如果您的数据量很大,您也可以每周进行一次。

现在您必须不时清理旧数据。这就是 Drop 和 Truncate 之间的区别所在。您最初拥有的分区列表是 p0,p1...p12。

删除分区 p1 时,列表变为 p0,p2,p3,p4...p12。如此有效地将 2 月和 3 月的数据放入 p2。

但是当您执行截断时,p1 仍然完好无损,但数据被逐出。所以列表仍然是 p0,p1...p12。