0

我对 Mysql/MariaDB 上的分区合并有疑问。

我的桌子看起来像这样:

PARTITION BY RANGE (TO_DAYS(`mydate`))
(
PARTITION p_first VALUES LESS THAN (TO_DAYS('2019-03-01')) ENGINE=InnoDB,
PARTITION p201903 VALUES LESS THAN (TO_DAYS('2019-04-01')) ENGINE=InnoDB,
PARTITION p201904 VALUES LESS THAN (TO_DAYS('2019-05-01')) ENGINE=InnoDB,
PARTITION p201905 VALUES LESS THAN (TO_DAYS('2019-06-01')) ENGINE=InnoDB,
PARTITION p201906 VALUES LESS THAN (TO_DAYS('2019-07-01')) ENGINE=InnoDB,
PARTITION p201907 VALUES LESS THAN (TO_DAYS('2019-08-01')) ENGINE=InnoDB,
PARTITION p201908 VALUES LESS THAN (TO_DAYS('2019-09-01')) ENGINE=InnoDB,
PARTITION p_future VALUES LESS THAN (MAXVALUE) ENGINE=InnoDB
);

分区非常大pfirst(500M 行),分区对于获取上个月的数据很有用。

每月我们使用以下查询将最旧的分区p201903合并pfirst并拆分p_future以创建新分区 ( ):p201909

ALTER TABLE mytable REORGANIZE PARTITION p_first, p201903  INTO ( PARTITION p_first VALUES LESS THAN (TO_DAYS('2019-04-01'));

ALTER TABLE EB_position REORGANIZE PARTITION p_future INTO ( PARTITION p201909 VALUES LESS THAN (TO_DAYS('2019-10-01')) ENGINE=InnoDB, PARTITION p_future VALUES LESS THAN (MAXVALUE) ENGINE=InnoDB );

mysql在技术上如何做到这一点?mysql 是否正在创建新的临时部分并将部分合并到其中?mysql是用其他部分填充的吗?那么,反转零件定义会更好吗?像 :

ALTER TABLE mytable REORGANIZE PARTITION p201903, p_first INTO ( PARTITION p_first VALUES LESS THAN (TO_DAYS('2019-04-01'));

感谢您的回答

4

1 回答 1

0

REORGANIZE将所有数据从源分区复制到目标分区。由于涉及到p_first并且分区很大,所以需要很长时间,并且会锁定表。

从另一个角度来看...... MySQL“玩得很安全”。但是通过必要数据的完整副本创建新分区,如果发生崩溃,旧分区是完整的。相反,如果它试图“合并”分区,崩溃可能会导致表损坏。安全(和简单)比速度更重要。

不要不断地添加到那个巨大的分区,而是添加到第二个分区。或者,将其视为构建年度分区。更具体地说,不要p_first理会并添加p201904p201903. 下个月,添加p201905p201903. 在年底,切换到“更好”的命名约定p2020来收集 2020 年的 12 个月。等等。

十年后,您将拥有大约 18 个分区;这并不“坏”,由于 18 个分区而不是 8 个分区,您会发现正常操作的差异很小。

...对于获取上个月的数据很有用。

仅当您扫描整个月的分区时。让我看看从您的每月分区中受益的查询。在几乎所有情况下,分区都不会提供性能优势。可能需要更改索引以使非分区表的工作速度与分区表一样快或更快。

于 2019-09-03T17:24:00.320 回答