本文汇总了使用冷热分离功能的相关限制。
仅支持在创建实例时选择是否创建包含冷热分离功能的实例;对于已创建的不包含冷热分离功能的实例,不支持动态开启该功能。
已创建含有冷热分离功能的实例,不支持动态关闭该功能,但可以选择不使用冷数据归档能力。详情请参将冷数据转换回热数据。
不支持对一张表同时使用 HTAP 和冷热分离功能。关于 HTAP 的详情信息,请参见 HTAP 介绍。
冷表虽在功能上与普通表没有区别,仍然可以做 DDL 和 DML 操作,但性能较差,为避免 IO 异常和性能风险,部分操作不建议执行,详情如下表所示:
说明
操作类型 | 冷表限制 | 说明 | ||
---|---|---|---|---|
DDL | instant | 尾部加列 | 支持 | 尾部加列只修改元数据。 |
改列类型(部分) | 支持 | |||
inplace | 创建/删除索引 | 不建议 | 会导致整表重建,因此不建议。 | |
删除列 | 不建议 | |||
copy | optimize 等 | 不建议 | ||
DML | 点查 | 主键查询 | 支持 | 主键查询可以快读定位数据。 |
二级索引查询 | 有风险 | 二级索引表可能需要回表,因此该操作具有一定的风险,需谨慎操作。 | ||
无索引查询 | 不建议 | 无索引查询会引起全表扫描,因此不建议。 | ||
范围查询 | 主键查询 | 有风险 | 仅支持小范围的查询。大范围的查询或无索引的查询,可能会引起全表扫描,因此不建议。 | |
二级索引查询 | 有风险 | |||
无索引查询 | 不建议 | |||
全表扫描 | 不建议 | |||
写操作 | 主键更新 | 有风险 | 支持更新主键数据和相关的二级索引,仅建议少量低频的写操作,大批量的更新会存在性能风险。 | |
二级索引更新 | 有风险 | |||
主键插入 | 有风险 | |||
其他 | 高并发读写操作 | 不建议 | 高并发的读写操作,可能会影响热表,导致无连接可用。 |
除以上场景外,分区表需特别注意查询更新是否带分区键。针对分区表的操作,若没有带分区键,MySQL 会遍历所有分区来查询满足条件的数据,容易带来性能风险。
普通表需要在 CREATE 或 ALTER 时通过设置 comment 调整表的冷热属性;分区表需要通过设置子分区的 comment 来调整冷热属性,不支持设置表级别的冷热属性,且不支持对包含二级分区的分区表做冷热转换。操作详情请参见归档冷数据。
仅支持在创建时对有明确分区的分区表指定冷热属性,因此不支持在创建时对 Hash 和 Key 类型的分区表指定子分区的冷热属性。只能在创建成功后,通过 ALTER
对子分区设置冷热属性。
普通表转分区表时,表级别的冷热属性将被自动剔除,需要重新通过 ALTER
对子分区设置冷热属性。同理,分区表转普通表时也需要重新设置表级别的冷热属性。
-- 创建一个分区表 create table table_name (a int) partition by hash(a) partitions 4; -- 将其转换为普通表,并设置冷热属性 alter table table_name comment="storage_policy=cold" remove partitioning;
表的冷热属性以 comment 为准,可继承 comment 的操作,则可继承冷热属性。
对于重建或创建表的 DDL,如果重建之后保留 comment 则可以继承属性,如果不保留 comment 则属性丢弃,需要重新设置。例如:
Hash 分区的分区表,optimize 之后会重建子分区,老的子分区的属性无法继承。
CREATE TABLE LIKE Hash 分区表,无 comment 可继承,则新分区表都没有设置属性。
CREATE AS 不会继承 comment,因此所有被创建出来的表都不会有属性。
Exchange 分区表和普通表会同步冷热属性。
如下所示,在 Exchange 分区表和普通表后,此表 a_1 中的 p0 分区将变为冷数据,表 a_n 将变为热数据。
-- 创建一个分区表 create table a_1 (a int) partition by range columns(a) ( partition p0 values less than (3) comment='storage_policy=hot', partition p1 values less than (5) comment='storage_policy=hot' ) -- 创建一个普通表 create table a_n (a int) comment="storage_policy=cold"; -- Exchange alter table a_1 exchange partition p0 with table a_n;