ADD INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] ADD INDEX [IF NOT EXISTS] name expression TYPE type [GRANULARITY value] [FIRST|AFTER name] - 向表的元数据中添加索引描述。
DROP INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] DROP INDEX [IF EXISTS] name - 从表的元数据中移除索引描述,并删除磁盘上的索引文件。该操作以变更的形式实现。
MATERIALIZE INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX [IF EXISTS] name [IN PARTITION partition_name] - 为指定的 partition_name 重建二级索引 name。该操作通过变更实现。如果省略 IN PARTITION 部分,则会为整张表的数据重建索引。
MATERIALIZE COLUMN 不能完全替代 MATERIALIZE INDEX。对于同时属于 wide + full-storage 的 parts,它可能会重写列值,但不会刷新独立存储的跳过索引 (或文本索引) 文件。存储在 skp_idx.packed 中的普通跳过索引是例外:在 wide + full-storage parts 上,仍可强制重新计算这些索引 (即默认 packed_skip_index_max_bytes 阈值以下的小型跳过索引子流;全文索引不会以这种方式打包) 。对于任何不是 wide + full-storage 的 part (包括 compact + full、compact + packed 和 wide + packed) ,重写整个 part 可以重新计算已有索引——小型 parts 通常采用 compact 格式,但默认仍使用完整的 part 存储。对于已包含数据的表新增索引时 (仅元数据的 ADD INDEX) ,以及在 wide+full-storage parts 上重写列后需要立即重建独立索引文件时,请使用 MATERIALIZE INDEX,以获得确定性 / 即时的处理方式。启用 materialize_skip_indexes_on_merge,且未通过 exclude_materialize_skip_indexes_on_merge 排除该索引时,历史 parts 上新添加的索引 (包括文本索引) 也可在后续合并时 materialize;否则,它们会保持未 materialize 状态,直到显式执行 MATERIALIZE INDEX。
CLEAR INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] CLEAR INDEX [IF EXISTS] name [IN PARTITION partition_name] - 从磁盘中删除二级索引文件,但不移除其描述信息。该操作实现为一种变更。
命令 ADD、DROP 和 CLEAR 都是轻量级的,也就是说,它们只会更改元数据或删除文件。
此外,这些命令也会被复制,并通过 ClickHouse Keeper 或 ZooKeeper 同步索引元数据。
只有使用
*MergeTree 引擎的表 (包括复制型变体) 才支持索引操作。并发 ALTER 与多子句 MATERIALIZE INDEX
ALTER,而先前的 ALTER 尚未在副本上应用 (元数据仍然滞后——即使此前的 alter 已被分配,仍可能如此) ,则可能触发 CANNOT_ASSIGN_ALTER (代码 517) 。这是通用的并发元数据 ALTER / 变更情形 (并非仅限于变更) ;请将操作串行化或重试,通过 mutations_sync / system.mutations 中的 is_done 等待先前会产生变更的 alter 完成,或者在语法允许时,将彼此独立的元数据操作合并为一个多子句 ALTER。请参阅 ALTER 查询的同步性 和 并发分配 ALTER。
一个 ALTER 中可以包含多个 MATERIALIZE INDEX 子句。仓库内已覆盖的情形是:在单条语句中,将多个 ADD INDEX 子句与针对这些新索引的 MATERIALIZE INDEX 一并组合使用 (tests/queries/0_stateless/02911_add_index_and_materialize_index.sql) 。这种组合形式适用于常规 (非 DatabaseReplicated) 数据库——DatabaseReplicated 会以 QUERY_IS_PROHIBITED 拒绝混合的 ADD INDEX + MATERIALIZE INDEX 分段。对于已存在的索引,仅物化的多子句形式在当前实现中遵循相同的元数据快照准备路径,但这种确切形式尚未由专门的无状态测试覆盖——在具备此类覆盖之前,应将其视为当前实现行为,而非单独保证的契约。若需按顺序应用,请每条语句只执行一个 MATERIALIZE INDEX,并使用 mutations_sync 等待。