自定义列存排序键

最近更新时间:2026-06-30 16:45:31

我的收藏
列存只读分析实例默认按照表的主键对数据进行重新组织,并以列式格式存储在列存节点。该方式能有效提升基于主键的查询效率以及过滤场景的扫描效率。当业务查询主要依赖非主键字段进行过滤或排序时,基于主键的排序可能无法发挥最佳性能。此时可通过自定义列存排序键进一步优化查询效率。典型场景如 SaaS 业务中常以租户 ID 作为过滤条件,即可将租户 ID 设置为排序键。
注意:
自定义列存排序键会触发数据重新组织,期间同步延迟会明显增加,建议在业务低峰期操作。

使用限制

自定义排序键必须包含表的主键列。若用户指定的排序键未包含主键,系统会自动将主键列追加到排序键末尾。
不支持无主键表设置自定义排序键。
自定义排序键最多包含8个字段列(该上限包含自动补入的主键列)。
不支持以下类型的列作为排序键:FLOATDOUBLELONGTEXTBLOB(含 TINYBLOBMEDIUMBLOBLONGBLOB)、BOOLEANJSON
不支持中文列名或包含特殊字符的列作为排序键,列名只能包含字母、数字和下划线。
对已设置自定义排序键的表,若对排序键中的列执行 DROP COLUMNMODIFY COLUMNRENAME COLUMNCHANGE COLUMNDROP PRIMARY KEY,会导致该列存表的数据同步中断。

操作步骤

通过 CREATE 语句创建自定义排序键表

在读写实例创建表时,可在表定义的 COMMENT 注释中通过 order_key=column1,column2 指定排序键。多列之间用英文逗号分隔。当 COMMENT 中包含其他信息时,建议使用空格将 order_key 与其他内容隔开,便于阅读。
CREATE TABLE '表名' (
...
) COMMENT 'order_key=column_name[,column_name]';
示例:
CREATE TABLE part (
p_partkey BIGINT NOT NULL PRIMARY KEY,
p_name VARCHAR(55) NOT NULL,
p_mfgr CHAR(25) NOT NULL,
p_brand CHAR(10) NOT NULL,
p_type VARCHAR(25) NOT NULL,
p_size BIGINT NOT NULL,
p_container CHAR(10) NOT NULL,
p_retailprice DECIMAL(15,2) NOT NULL,
p_comment VARCHAR(23) NOT NULL
) COMMENT '零件信息表 order_key=p_brand,p_container,p_type';

通过 ALTER 语句修改排序键

对已创建的表,可在读写实例中执行 ALTER TABLE 修改 COMMENT,为表设置或变更自定义排序键。
ALTER TABLE table_name COMMENT 'order_key=column_name[,column_name]';
示例:
ALTER TABLE part COMMENT '零件信息表 order_key=p_brand,p_container,p_type';

确认排序键修改结果

目前暂不提供排序键调整进度的查询接口。修改排序键期间,表依然支持查询。由于排序键变更会触发数据重新组织,同步延迟会在期间增加。可通过观察列存表的同步延迟,判断排序键变更是否完成。

使用建议

order_key 关键字必须使用下划线形式(order_key),不支持 orderkeyorderKey 等其他写法。
同一 COMMENT 中仅能指定一次 order_key,请勿重复书写。
排序键列名不能重复。
修改排序键建议在业务低峰期进行,避免同步延迟增加影响分析查询的数据时效性。