Вторичное индексирование в Azure Cosmos DB для Apache Cassandra

ПРИМЕНИМО К: Кассандра

API для Cassandra в Azure Cosmos DB использует базовую инфраструктуру индексирования для предоставления надежности индексирования, присущей платформе. Однако, в отличие от основного API для NoSQL, API для Cassandra в Azure Cosmos DB не индексирует все атрибуты по умолчанию. Вместо этого служба поддерживает вторичное индексирование и создает индекс для определенных атрибутов, который работает так же, как Apache Cassandra.

В целом не рекомендуется выполнять запросы фильтрации для столбцов, которые не секционированы. Необходимо явно использовать конструкцию ALLOW FILTERING, что может вести к ненадлежащему выполнению операции. В Azure Cosmos DB такие запросы можно выполнять с атрибутами низкого уровня кратности, так как они распределяются по разделам для получения результатов.

Не рекомендуется создавать индекс для часто обновляемого столбца. Имеет смысл создавать индекс при определении таблицы. Это обеспечит согласованность данных и индексов. Если вы создаете новый индекс для существующих данных, в настоящее время отслеживать ход его изменения для таблицы нельзя. Если вам нужно контролировать ход выполнения этой операции, отправьте запрос на отслеживание хода выполнения в службу поддержки.

Примечание

Вторичные индексы можно создать только с помощью команд CQL, упомянутых в этой статье, а не с помощью служебных программ поставщика ресурсов (шаблоны ARM, Azure CLI, PowerShell или Terraform). Вторичные индексы не поддерживаются для следующих объектов:

  • данных таких типов, такие как замороженные коллекции, типы decimal и variant;
  • статические столбцы;
  • ключи кластеризации.

Предупреждение

Ключи секций не индексируются по умолчанию в API для Cassandra. Если у вас есть составной первичный ключ в таблице, и вы фильтруете по ключу секции и ключу кластеризации или только по ключу секции, это обеспечит желаемое поведение. Однако если фильтровать по ключу секции и другим неиндексированным полям, кроме ключа кластеризации, ключ секции будет исключен из результатов, даже если другие неиндексированные поля имеют вторичный индекс. Если у вас в таблице есть составной первичный ключ, и вы хотите выполнить фильтрацию и по элементу значения ключа разделов составного первичного ключа, и по другому полю, которое не является ключом секции или ключом кластеризации, явно добавьте вторичный индекс в ключ секции. Индекс в этом сценарии должен значительно повысить производительность запросов, даже если у других полей, не являющихся ключами секции и ключами кластеризации, нет индекса. Дополнительные сведения см. в нашей статье о секционировании.

Пример индексирования

Сначала создайте тестовое пространство ключей и таблицу, выполнив следующие команды в командной строке оболочки CQL:

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 для Cassandra поддерживает ALLOW FILTERING, как упоминалось в предыдущем разделе, это не рекомендуется. Вместо этого следует создать индекс, как показано в следующем примере:

CREATE INDEX ON sampleks.t1 (lastname);

После создания индекса по полю lastname вы сможете успешно выполнить предыдущий запрос. При использовании API для Cassandra в Azure Cosmos DB не требуется предоставлять имя индекса. Используется индекс по умолчанию с именем в формате tablename_columnname_idx. Например, t1_lastname_idx — это имя индекса для предыдущей таблицы.

Удаление индекса

Для удаления индекса необходимо знать его имя. Выполните команду desc schema, чтобы получить описание таблицы. Выходные данные этой команды содержат имя индекса в формате CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Затем имя индекса можно использовать для его удаления, как показано в следующем примере:

drop index sampleks.t1_lastname_idx;

Дальнейшие действия