mysql drop partition 和 truncate partition 有什么区别

What is the difference between mysql drop partition and truncate partition

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

ALTER TABLE A DROP PARTITION p0;

ALTER TABLE A TRUNCATE PARTITION p0;

哪些场景下应该使用DROP/TRUNCATE分区?

两者都把数据丢掉了。而且它不是 'transactional',因此您无法使用 ROLLBACK.

恢复数据

DROP PARTITION 也从分区列表中删除分区。

TRUNCATE PARTITION 保留分区,但空着。

DROP PARTITION 的一个常见用法是删除 "old" 行。想一想只需要保留 90 天的 table 信息。使用 PARTITION BY RANGE(TO_DAYS(...)) 并每周分区。然后,每周 DROP 最旧的分区和 ADD 一个新分区。更多讨论 here.

我还没有看到需要 TRUNCATE

请注意,您可以从 PARTITIONing 中获益的用例非常少。到目前为止,我发现仅用于 PARTITION BY RANGE.

当您在 table 上有 LIST 分区时,TRUNCATING 分区是个不错的选择。 它将删除属于 LIST 分区的所有行,但不会从 table 结构中删除分区条目。

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

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.