我正在try 计算对一个大表进行分区需要多长时间.我对这个表进行了大约两周的分区,不知道还需要多长时间.有没有办法计算这个查询可能需要多长时间?
以下是正在讨论的查询.
ALTER TABLE pIndexData REORGANIZE PARTITION pMAX INTO (
PARTITION p2022 VALUES LESS THAN (UNIX_TIMESTAMP('2023-01-01 00:00:00 UTC')),
PARTITION pMAX VALUES LESS THAN (MAXVALUE)
)
对于上下文,pIndexData表有大约60亿条记录,而Pmax分区有大约20亿条记录.这是一个Amazon Aurora实例,服务器运行的是MySQL 5.7.12.数据库引擎是InnoDB.以下是表的语法.
CREATE TABLE `pIndexData` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`DateTime-UNIX` bigint(20) NOT NULL DEFAULT '0',
`pkl_PPLT_00-PIndex` int(11) NOT NULL DEFAULT '0',
`DataValue` decimal(14,4) NOT NULL DEFAULT '0.0000',
PRIMARY KEY (`pkl_PPLT_00-PIndex`,`DateTime-UNIX`),
KEY `id` (`id`),
KEY `DateTime` (`DateTime-UNIX`) USING BTREE,
KEY `pIndex` (`pkl_PPLT_00-PIndex`) USING BTREE,
KEY `DataIndex` (`DataValue`),
KEY `pIndex-Data` (`pkl_PPLT_00-PIndex`,`DataValue`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (`DateTime-UNIX`)
(PARTITION p2016 VALUES LESS THAN (1483246800) ENGINE = InnoDB,
PARTITION p2017 VALUES LESS THAN (1514782800) ENGINE = InnoDB,
PARTITION p2018 VALUES LESS THAN (1546318800) ENGINE = InnoDB,
PARTITION p2019 VALUES LESS THAN (1577854800) ENGINE = InnoDB,
PARTITION p2020 VALUES LESS THAN (1609477200) ENGINE = InnoDB,
PARTITION p2021 VALUES LESS THAN (1641013200) ENGINE = InnoDB,
PARTITION pMAX VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
在研究这个问题时,我发现使用性能模式可以为我的问题提供答案.但是,此服务器上未启用性能架构,启用它需要重新启动.不能 Select 重新启动,因为这样做可能会在处理此查询时损坏数据库.
为了了解这需要多长时间,我在一个单独的Aurora实例中重新创建了pIndexData表.然后我导入了一个样本数据集(大约300万条记录).样本集的日期时间值分布在2021年、2022年和2023年,其中2022年的数据份额最大.然后,我运行相同的重组分区查询,并计算完成所需的时间.分区查询耗时2分29秒.如果对记录的分区查询是线性的,我估计对原始表的查询大约需要18个小时.似乎没有线性计算.即使有很大的误差,这也是遥不可及的.显然,我遗漏了一些因素(可能有很多).
除了再次运行样本数据测试之外,我不确定还能try 什么,但要使用更大的数据样本.在我这么做之前,我希望有人可能会有一些见解,如何最好地计算这可能需要多长时间才能完成.