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.
有人可以解释以下命令之间的区别吗?
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.