![](/img/trans.png)
[英]MySQL table Partition with FLOOR function (partition function not allowed)?
[英]MySQL 8 InnoDB - Partition function not allowed
我正在尝试对具有 300M+ 行的表进行分区。 数据包含 15 个月,我只需要定期使用过去 6 个月,偶尔需要过去 13 个月。
为了提高 6 个月查询的查询速度,我提出了以下分区命令:
ALTER TABLE my_db.my_table
PARTITION BY RANGE (DATE_FORMAT(date, '%Y%m')) (
PARTITION 2021_H1 VALUES LESS THAN (202107),
PARTITION 2021_H2 VALUES LESS THAN (202201),
PARTITION 2022_H1 VALUES LESS THAN (202207),
PARTITION current VALUES LESS THAN (MAXVALUE)
) ;
作为回报,我得到:
[HY000][1564] This partition function is not allowed
这里有什么问题?
正如错误消息所暗示的那样,并非每个 function 都允许作为分区 function。 尝试使用to_days
:
ALTER TABLE my_db.my_table
PARTITION BY RANGE (to_days(`date`)) (
PARTITION 2021_H1 VALUES LESS THAN (to_days('2021-07-01')),
PARTITION 2021_H2 VALUES LESS THAN (to_days('2022-01-01')),
PARTITION 2022_H1 VALUES LESS THAN (to_days('2022-07-01')),
PARTITION current VALUES LESS THAN (MAXVALUE)
) ;
注意:如果您遇到Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function
确保根据原始 PK 和date
列创建复合主键。 如果在 MySQL 中定义分区时表中有 PK,则这是强制性的。
注意:分区 InnoDB 表不支持外键。 因此,在进行分区尝试之前,请确保您首先没有它们。
ALTER TABLE my_db.my_table PARTITION BY RANGE (`date`) ( PARTITION 2021_H1 VALUES LESS THAN (20210701), PARTITION 2021_H2 VALUES LESS THAN (20220101), PARTITION 2022_H1 VALUES LESS THAN (20220701), PARTITION current VALUES LESS THAN (MAXVALUE) ) ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.