Azure Cosmos DB for Apache Cassandra 中的辅助索引编制

适用对象: Cassandra

Azure Cosmos DB 中的 API for Cassandra 利用底层索引基础结构来公开平台中固有的索引编制强度。 但是,与核心 API for NoSQL 不同,Azure Cosmos DB 中的 API for Cassandra 默认情况下不会为所有特性编制索引。 它支持使用辅助索引编制来为特定的特性创建索引,其行为方式与 Apache Cassandra 相同。

一般情况下,不建议对未分区的列执行筛选查询。 必须显式使用 ALLOW FILTERING 语法,这可能会导致某个操作无法正常执行。 在 Azure Cosmos DB 中,可对低基数特征运行此类查询,因为这些查询会在不同的分区之间扇出以检索结果。

不建议为经常更新的列创建索引。 在定义表时创建索引是明智之举。 这可以确保数据和索引处于一致状态。 如果为现有数据创建新索引,目前,无法跟踪表的索引进度变化。 如果需要跟踪此操作的进度,必须通过支持票证来请求进度变化。

注意

只能使用本文中提到的 CQL 命令创建辅助索引,而不能通过资源提供程序实用工具(ARM 模板、Azure CLI、PowerShell 或 Terraform)创建。 以下对象不支持辅助索引:

  • 冻结的集合类型、小数和变体类型等数据类型。
  • 静态列
  • 聚集键

警告

默认情况下,API for Cassandra 中不会为分区键编制索引。 如果表中有一个复合主键,并且对分区键和聚类分析键进行筛选,或者只筛选分区键,这将提供所需的行为。 但是,如果对分区键和除聚类分析键之外的任何其他非索引字段进行筛选,这将导致分区键扇出 - 即使其他非索引字段具有辅助索引也是如此。 如果表中有复合主键,并且你想要筛选复合主键的分区键值元素,以及不是分区键或聚类分析键的另一个字段,请确保在分区键上显式添加辅助索引。 此方案中的索引应显著提高查询性能,即使其他非分区键和非聚集键字段没有索引也是如此。 有关详细信息,请参阅关于分区的文章。

索引编制示例

首先,在 CQL shell 提示符下运行以下命令以创建一个示例键空间和表:

CREATE KEYSPACE sampleks WITH REPLICATION = {'class' : 'SimpleStrategy'};
CREATE TABLE sampleks.t1(user_id int PRIMARY KEY, lastname text) WITH cosmosdb_provisioned_throughput=400;

然后,使用以下命令插入示例用户数据:

insert into sampleks.t1(user_id,lastname) values (1, 'nishu');
insert into sampleks.t1(user_id,lastname) values (2, 'vinod');
insert into sampleks.t1(user_id,lastname) values (3, 'bat');
insert into sampleks.t1(user_id,lastname) values (5, 'vivek');
insert into sampleks.t1(user_id,lastname) values (6, 'siddhesh');
insert into sampleks.t1(user_id,lastname) values (7, 'akash');
insert into sampleks.t1(user_id,lastname) values (8, 'Theo');
insert into sampleks.t1(user_id,lastname) values (9, 'jagan');

如果尝试执行以下语句,将会遇到错误,要求你使用 ALLOW FILTERING

select user_id, lastname from sampleks.t1 where lastname='nishu';

尽管 API for Cassandra 支持上一部分中所述的 ALLOW FILTERING,但不建议使用此语法。 应按以下示例中所示创建索引:

CREATE INDEX ON sampleks.t1 (lastname);

对“lastname”字段创建索引后,接下来可以成功运行以前的查询。 使用 Azure Cosmos DB 中的 API for Cassandra 时,无需提供索引名称。 将使用格式为 tablename_columnname_idx 的默认索引。 例如, t1_lastname_idx 是上述表的索引名称。

删除索引

要删除某个索引,需要知道其名称。 运行 desc schema 命令来获取表的说明。 此命令的输出包含 CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname) 格式的索引名称。 然后,可以使用索引名称删除该索引,如以下示例中所示:

drop index sampleks.t1_lastname_idx;

后续步骤