Mysql重组算法

Mysql REORGANIZE algorithm

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

我的 table 看起来是这样的:

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 分区非常大(5 亿行),分区对于获取上个月的数据很有用。

我们每月将最旧的分区 p201903pfirst 合并并拆分 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'));

感谢您的回答

REORGANIZE 将所有数据从源分区复制到目标分区。由于涉及到p_first,而且那个分区很大,耗时较长,锁table.

换个角度看...MySQL"plays it safe"。但是通过必要数据的完整副本创建新分区,如果发生崩溃,旧分区是完好无损的。相反,如果它试图 "merge" 分区,则崩溃可能会使 table 损坏。安全(和简单)比速度更重要。

不要继续添加到那个巨大的分区,而是添加到第二个分区。或者,将其视为构建年度分区。更具体地说,保留 p_first 并将 p201904 添加到 p201903。下个月,将 p201905 添加到 p201903。在年底,切换到p2020的'better'命名约定,以收集2020年的12个月等

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

... useful to get data from last months.

仅当您扫描整个月的分区时。让我看看受益于每月分区的查询。几乎在所有情况下,分区都不会提供性能优势。可能需要更改索引才能使非分区索引 table 与分区索引一样快,甚至更快。