适用对象:
卡珊德拉
重要
你是否正在寻找一种数据库解决方案,以应对需要高扩展性、99.999% 可用性服务级别协议(SLA)、即时自动扩展和跨多个区域的自动故障转移的场景? 请考虑使用 Azure Cosmos DB for NoSQL。
Azure Cosmos DB中 Cassandra 的 API 使用基础索引基础结构公开平台固有的索引功能。 但是,与用于NoSQL的核心 API 不同,Azure Cosmos DB中的 Cassandra API 默认情况下不会为所有属性编制索引。 相反,它支持辅助索引以在特定属性上创建索引,该索引的工作方式与 Apache Cassandra 相同。
一般情况下,请避免对未分区的列运行筛选器查询。 你需要显式使用 ALLOW FILTERING 语法,这会导致可能无法正常运行的操作。 在 Azure Cosmos DB 中,你可以针对基数较低的属性执行此类查询,因为这类查询会扇出到各个分区才能返回结果。
我们不建议在经常更新的列上创建索引。 而是在定义表时创建索引。 此方法可确保数据和索引处于一致状态。 如果在现有数据上创建新索引,则当前无法跟踪该表的索引构建进度。 如果需要跟踪此操作的进度,请通过 支持票证请求进度更改。
注释
只能使用本文中所述的 CQL 命令创建辅助索引。 无法使用资源提供程序实用工具(ARM 模板、Azure CLI、PowerShell 或 Terraform)创建辅助索引。 以下对象不支持辅助索引:
- 数据类型,如冻结集合类型、十进制类型和变体类型。
- 静态列
- 聚集键
警告
默认情况下,适用于 Cassandra 的 API 不会为分区键编制索引。 如果您的表具有 复合主键,并且按分区键和聚类键进行筛选,或者仅按分区键进行筛选,就会得到所需的结果。 但是,如果将分区键和除聚类分析键之外的任何其他非索引字段进行筛选,此筛选器会导致分区键扇出 -即使其他非索引字段具有辅助索引也是如此。 如果表具有复合主键,并且想要同时筛选复合主键的分区键值元素,以及不是分区键或聚类键的另一个字段,请在 分区键上显式添加辅助索引。 此方案中的索引应显著提高查询性能,即使其他非分区键和非聚集键字段没有索引也是如此。 有关详细信息,请参阅 分区。
索引编制示例
首先,在 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 中使用 Cassandra API 时,无需提供索引名称。 使用格式 tablename_columnname_idx 的默认索引。 例如, t1_lastname_idx 是上述表的索引名称。
删除索引
要删除索引,您需要知道索引名称。 运行 desc schema 命令来获取表的说明。 此命令的输出包含 CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname) 格式的索引名称。 然后,可以使用索引名称删除索引,如以下示例所示:
drop index sampleks.t1_lastname_idx;
后续步骤
- 了解 Azure Cosmos DB 中的自动索引
- Azure Cosmos DB for Apache Cassandra 支持的 Apache Cassandra 功能