Compartir vía


Indexación secundaria en Azure Cosmos DB for Apache Cassandra

SE APLICA A: Cassandra

La API para Cassandra de Azure Cosmos DB aprovecha la infraestructura de indexación subyacente para exponer la intensidad de indexación inherente a la plataforma. Sin embargo, a diferencia de la API principal para NoSQL, la API para Cassandra de Azure Cosmos DB no indexa todos los atributos de manera predeterminada. En su lugar, admite la indexación secundaria para crear un índice sobre determinados atributos, que se comporta de la misma manera que Apache Cassandra.

En general, no se recomienda ejecutar consultas de filtro en las columnas que no tienen particiones. Debe usar la sintaxis ALLOW FILTERING explícitamente, lo que da como resultado una operación que podría no tener un buen rendimiento. En Azure Cosmos DB puede ejecutar estas consultas sobre atributos de baja cardinalidad, ya que se dividen entre las particiones para recuperar los resultados.

No se recomienda crear un índice en una columna que se actualiza con frecuencia. Es prudente crear un índice al definir la tabla. Esto garantiza que los datos y los índices se encuentran en un estado coherente. En el caso de que cree un nuevo índice sobre los datos existentes, actualmente no puede realizar un seguimiento de los cambios del progreso del índice de la tabla. Si necesita realizar un seguimiento del progreso de esta operación, tendrá que solicitar el cambio de progreso mediante una incidencia de soporte técnico.

Nota:

Los índices secundarios solo se pueden crear mediante los comandos CQL mencionados en este artículo y no a través de las utilidades del proveedor de recursos (plantillas de ARM, CLI de Azure, PowerShell o Terraform). No se admiten índices secundarios en los objetos siguientes:

  • tipos de datos como tipos de colección inmovilizados, decimales y tipos Variant.
  • Columnas estáticas
  • Claves de agrupación en clústeres

Advertencia

Las claves de partición no se indexan de forma predeterminada en la API para Cassandra. Si tiene una clave principal compuesta en la tabla y filtra por clave de partición y clave de agrupación en clústeres, o simplemente por clave de partición, conseguirá el comportamiento deseado. Sin embargo, si filtra por clave de partición y cualquier otro campo no indexado aparte de la clave de agrupación en clústeres, esto dará como resultado una distribución ramificada de salida de claves de partición, aunque los otros campos no indexados tengan un índice secundario. Si tiene una clave principal compuesta en la tabla y quiere filtrar por el elemento de valor de clave de partición de la clave principal compuesta y por otro campo que no sea la clave de partición o de agrupación en clústeres, asegúrese de agregar explícitamente un índice secundario en la clave de partición. El índice de este escenario debe mejorar significativamente el rendimiento de las consultas, aunque los otros campos de clave que no sea de partición ni de agrupación en clústeres no tengan índice. Revise nuestro artículo sobre creación de particiones para obtener más información.

Ejemplo de indexación

En primer lugar, cree un espacio de claves y una tabla de ejemplo mediante la ejecución de los siguientes comandos en el símbolo del sistema de CQL:

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

A continuación, inserte los datos de usuario de ejemplo con los siguientes comandos:

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

Si intenta ejecutar la instrucción siguiente, se producirá un error que le pedirá que use la opción ALLOW FILTERING:

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

Aunque la API para Cassandra admite la opción ALLOW FILTERING, como se mencionó en la sección anterior, no se recomienda. En su lugar, debe crear un índice, tal y como se muestra en el ejemplo siguiente:

CREATE INDEX ON sampleks.t1 (lastname);

Después de crear un índice en el campo "lastname", ahora puede ejecutar la consulta anterior correctamente. Con la API para Cassandra de Azure Cosmos DB, no es necesario proporcionar un nombre de índice. Se utiliza un índice predeterminado con el formato tablename_columnname_idx. Por ejemplo, t1_lastname_idx es el nombre del índice de la tabla anterior.

Eliminación del índice

Debe saber cuál es el nombre del índice para eliminarlo. Ejecute el comando desc schema para obtener la descripción de la tabla. La salida de este comando incluye el nombre del índice con el formato CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Después, puede usar el nombre del índice para eliminar el índice, tal y como se muestra en el ejemplo siguiente:

drop index sampleks.t1_lastname_idx;

Pasos siguientes