Compartilhar via

Azure Cosmos DB for Apache Cassandra 中的次级索引编制

适用对象: 卡珊德拉

重要

你是否正在寻找一种数据库解决方案,以应对需要高扩展性、99.999% 可用性服务级别协议(SLA)、即时自动扩展和跨多个区域的自动故障转移的场景? 请考虑使用 Azure Cosmos DB for NoSQL

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';

尽管 Cassandra 的 API 支持上一部分中所述的 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;

后续步骤