我正在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 什么,但要使用更大的数据样本.在我这么做之前,我希望有人可能会有一些见解,如何最好地计算这可能需要多长时间才能完成.

推荐答案

添加(或删除)分区必然会复制所有数据并重新构建所有表.因此,如果您的表足够大以保证分区(超过1M行),那么它将需要相当长的时间.

REORGANIZE个一个(或几个)分区(例如,PMAX)"into..."的情况下,度量标准是PMAX中有多少行.

should所做的是在2021晚些时候创建LESS THAN 2022,当时PMAX是空的.

建议您将Pmax重组为2022、and、2023和Pmax now.同样,时间与PMAX的大小成正比.然后确保在2023年12月创建2024,那时Pmax仍然是空的.

按年分区的优势是什么?你最终会清除旧数据吗?(这可能是唯一的优势.)

至于您的测试--当您测量2m29s时,其他分区中没有任何东西吗?这个测试大概是正确的.添加2021索引行可能会带来很小的负担.

附注:以下内容是不必要的,因为有2个其他索引处理它:

KEY `pIndex` (`pkl_PPLT_00-PIndex`) USING BTREE,

然而,我不知道是否会立即放弃.

Mysql相关问答推荐

过程/别名是有点长的MySQL命令的一部分吗?

嵌套MySQL语句问题

MySQL将JSON值从对象类型更改为数组

如何为Oracle DB查询获得所需的GROUP BY结果?

在MySQL CLI中,是否有自动完成过程的方法?

为什么MySQL派生条件下推优化不起作用

从表中动态删除所有空列

在 mySQL 中计算每日数组的每周指标

列出每年最多产的三位作家

拆分列值并适当地返回拆分值

将sql查询转换为sequelize

MySql,如何从列中替换某种格式的字符串

基于 3 个条件 Select 3 行的最佳 MySQL 索引和查询

MySQL查询根据同一表中其他字段的值更新表中的字段

结果差异(MySQL 5.7 vs MySQL 8.0)

MySQL 工作台与 phpMyAdmin

在mysql中将纪元数转换为人类可读的日期

MySQL函数查找两个日期之间的工作日数

MySQL:按字段排序,将空单元格放在末尾

Mysql 错误:try 转储表空间时,指定为定义者的用户 ('mysql.infoschema'@'localhost') 不存在'