mysql drop partition和truncate partition有什么区别?

3

有人能解释一下以下命令的区别吗?

Original Answer翻译成"最初的回答"

ALTER TABLE A DROP PARTITION p0;

并且

ALTER TABLE A TRUNCATE PARTITION p0;

在什么情况下应该使用DROP/TRUNCATE分区?
最初的回答:在需要删除分区中所有数据时,可以使用DROP/TRUNCATE分区。DROP分区将删除整个分区及其数据,而TRUNCATE分区将删除分区中的数据,但保留分区结构。这两种操作都非常快速,但需要谨慎使用,以确保不会误删除数据。

2
不如先阅读文档 https://dev.mysql.com/doc/refman/5.5/en/alter-table-partition-operations.html - rkosegi
3个回答

3
两者都会丢弃数据。并且它不是“事务性”的,因此您无法使用ROLLBACK恢复数据。 DROP PARTITION还会从分区列表中删除该分区。 TRUNCATE PARTITION保留分区,但为空。 DROP PARTITION的常见用途是删除“旧”行。想象一下需要仅保留90天的信息表。使用PARTITION BY RANGE(TO_DAYS(...))并进行每周分区。然后,每周删除最旧的分区并添加新分区。更多讨论here
我没有看到使用TRUNCATE的必要性。
请注意,很少有用例可以从PARTITIONing中获得任何好处。到目前为止,我只发现了PARTITION BY RANGE的用途。

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) */ |

如果您的数据量很大,您也可以按周进行操作。

现在,您必须定期清理旧数据。这就是删除和截断之间的区别所在。您最初拥有的分区列表为p0、p1...p12。

当您删除一个分区p1时,列表变为p0、p2、p3、p4...p12。因此,二月和三月的数据实际上都会进入p2。

但是,当您执行截断时,p1仍然保持完好无损,但数据被驱逐。因此,列表仍然是p0、p1...p12。


0

如果你在表上使用了LIST分区,截断某个分区将是个不错的选择。截断操作将删除所有属于该LIST分区的行,但不会从表结构中删除该分区条目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接