Todos los productos
Search
Centro de documentos

Tablestore:Get started with secondary indexes by using Tablestore SDKs

Última actualización: Oct 09, 2026

Un índice secundario amplía la capacidad de consulta por clave principal de una tabla de datos hacia distintas columnas. Cuando necesite consultar datos mediante columnas de atributos, cree un índice secundario para acelerar las consultas. Al especificar las columnas predefinidas, puede usarlas como columnas de índice o como columnas de atributos de la tabla de índice durante la creación del índice secundario. Una vez creado el índice secundario, úselo para consultar datos.

Requisitos previos

Se requiere una tabla de datos creada previamente. El número máximo de versiones (max versions) de la tabla de datos debe ser 1 y su tiempo de vida (TTL) debe cumplir una de a continuación condiciones:

  • El TTL de la tabla de datos es -1 (los datos nunca caducan).

  • Si el TTL de la tabla de datos no es -1, la tabla debe estar en estado de actualización prohibida (es decir, Allow Updates establecido en No).

Nota

El TTL de un índice secundario es igual al TTL de la tabla de datos.

Paso 1: (Opcional) Gestionar columnas predefinidas

Al usar un índice secundario, si no hay columnas predefinidas configuradas o las existentes no cubren sus necesidades, agregue o elimine columnas predefinidas en la tabla de datos.

Para gestionar las columnas predefinidas, utilice Tablestore SDK for Java o Tablestore SDK for Go. En esta sección se usa el SDK de Java como ejemplo.

Agregar una columna predefinida

Parámetros

Parámetro

Tipo

Descripción

tableName (obligatorio)

String

Nombre de la tabla de datos.

definedColumns (obligatorio)

List

Información de las columnas predefinidas. Cada columna predefinida incluye a continuación parámetros:

  • name (String, obligatorio): nombre de la columna predefinida.

  • type (DefinedColumnType, obligatorio): tipo de datos de la columna predefinida. Valores válidos: STRING, INTEGER, BINARY, DOUBLE y BOOLEAN.

Código de ejemplo

A continuación se agrega una columna predefinida llamada name, de tipo STRING, a la tabla de datos example_table.

AddDefinedColumnRequest request = new AddDefinedColumnRequest();
request.setTableName("example_table");
request.addDefinedColumn("name", DefinedColumnType.STRING);
client.addDefinedColumn(request);

Eliminar una columna predefinida

Parámetros

Parámetro

Tipo

Descripción

tableName (obligatorio)

String

Nombre de la tabla de datos.

definedColumns (obligatorio)

List<String>

Nombres de las columnas predefinidas que se van a eliminar.

Código de ejemplo

En este ejemplo se elimina la columna predefinida llamada name de la tabla de datos example_table.

DeleteDefinedColumnRequest request = new DeleteDefinedColumnRequest();
request.setTableName("example_table");
request.addDefinedColumn("name");
client.deleteDefinedColumn(request);

Paso 2: Crear un índice secundario

Llame a la operación CreateIndex para construir una tabla de índice sobre una tabla de datos existente y así acelerar las consultas. Los índices secundarios se clasifican en globales y locales. Cree uno u otro según sus requisitos de negocio.

Nota

También puede construir una o más tablas de índice al mismo tiempo que la tabla de datos mediante la operación CreateTable. Para obtener más información, consulte Create a data table.

Los ejemplos siguientes utilizan Tablestore SDK for Java. También son compatibles a continuación SDK: Go, Python, Node.js, .NET y PHP.

Crear un índice secundario global

A continuación se construye un índice secundario global llamado example_global_index para la tabla de datos example_table. La tabla de índice incluye los datos existentes.

Establezca IncludeBaseData en true para incluir las filas existentes de la tabla de datos en el índice. El tiempo necesario para rellenar los datos existentes varía según el volumen de datos.

IndexMeta indexMeta = new IndexMeta("example_global_index");
indexMeta.addPrimaryKeyColumn("category");
indexMeta.addDefinedColumn("status");

CreateIndexRequest request =
        new CreateIndexRequest("example_table", indexMeta, true);
client.createIndex(request);

Crear un índice secundario local

Cuando construya un índice secundario local, use la primera columna de clave principal de la tabla de datos como primera columna de clave principal del índice. Además, establezca el tipo de índice y el modo de actualización en IT_LOCAL_INDEX y IUM_SYNC_INDEX, respectivamente.

Establezca IncludeBaseData en true para incluir las filas existentes de la tabla de datos en el índice. El tiempo necesario para rellenar los datos existentes varía según el volumen de datos.

IndexMeta indexMeta = new IndexMeta("example_local_index");
indexMeta.addPrimaryKeyColumn("user_id");
indexMeta.addPrimaryKeyColumn("category");
indexMeta.addDefinedColumn("status");
indexMeta.setIndexType(IndexType.IT_LOCAL_INDEX);
indexMeta.setIndexUpdateMode(IndexUpdateMode.IUM_SYNC_INDEX);

CreateIndexRequest request =
        new CreateIndexRequest("example_table", indexMeta, true);
client.createIndex(request);

Paso 3: Leer datos de la tabla de índice

Desde una tabla de índice puede leer una sola fila o un rango de datos. El método de lectura depende de si las columnas de atributos que desea devolver están presentes en la tabla de índice:

  • Las columnas de atributos están en la tabla de índice: lea directamente la tabla de índice para obtener los datos.

  • Las columnas de atributos no están en la tabla de índice: consulte la tabla de datos por su cuenta para obtener los datos.

Los ejemplos siguientes utilizan Tablestore SDK for Java. También son compatibles a continuación SDK: Go, Python, Node.js, .NET y PHP.

Leer una sola fila

Lea una única fila de datos. A continuación se lee una fila del índice secundario global example_global_index con base en la clave principal completa, y se devuelve únicamente la columna de atributo status.

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("category", PrimaryKeyValue.fromString("books"))
        .addPrimaryKeyColumn("user_id", PrimaryKeyValue.fromString("user-1"))
        .addPrimaryKeyColumn("order_id", PrimaryKeyValue.fromLong(101L))
        .build();

SingleRowQueryCriteria criteria =
        new SingleRowQueryCriteria("example_global_index", primaryKey);
criteria.addColumnsToGet("status");
criteria.setMaxVersions(1);

GetRowResponse response = client.getRow(new GetRowRequest(criteria));
System.out.println(response.getRow());

Leer un rango de filas

Lea los datos dentro de un rango específico de claves principales. Establezca una clave principal inicial y final en la tabla de índice, y llame a getRange en un ciclo hasta que nextStartPrimaryKey sea null.

Usar un índice secundario global

Cuando las columnas de atributos que desea devolver están en la tabla de índice, lea directamente la tabla de índice para obtener los datos.

private static void scanFromIndex(SyncClient client) {
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>");

    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    System.out.println("Scan result of the index table:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Cuando las columnas de atributos que desea devolver no están en la tabla de índice, consulte la tabla de datos por su cuenta para obtener los datos.

private static void scanFromIndex(SyncClient client) {
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>");

    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            // Extract the data table primary key from the index row.
            PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
            PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
            PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
            PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
            PrimaryKey mainTablePK = mainTablePKBuilder.build();

            // Fetch the required columns from the data table.
            SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", mainTablePK);
            criteria.addColumnsToGet(DEFINED_COL_NAME_3);
            criteria.setMaxVersions(1);
            GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
            Row mainTableRow = getRowResponse.getRow();
            System.out.println(row);
        }
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Usar un índice secundario local

Cuando las columnas de atributos que desea devolver están en la tabla de índice, lea directamente la tabla de índice para obtener los datos.

private static void scanFromIndex(SyncClient client) {
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("INDEX_NAME");

    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    System.out.println("Scan result of the index table:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Cuando las columnas de atributos que desea devolver no están en la tabla de índice, consulte la tabla de datos por su cuenta para obtener los datos.

private static void scanFromIndex(SyncClient client) {
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>");

    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            // Extract the data table primary key from the index row.
            PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
            PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
            PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
            PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
            PrimaryKey mainTablePK = mainTablePKBuilder.build();

            // Fetch the required columns from the data table.
            SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("TABLE_NAME", mainTablePK);
            criteria.addColumnsToGet(DEFINED_COL_NAME3);
            criteria.setMaxVersions(1);
            GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
            Row mainTableRow = getRowResponse.getRow();
            System.out.println(row);
        }
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Apéndice: Eliminar una tabla de índice

Elimine una tabla de índice cuando ya no la necesite.

Los ejemplos siguientes utilizan Tablestore SDK for Java. También son compatibles a continuación SDK: Go, Python, Node.js, .NET y PHP.

A continuación se elimina el índice secundario example_index de la tabla de datos example_table.

DeleteIndexRequest request =
        new DeleteIndexRequest("example_table", "example_index");
DeleteIndexResponse response = client.deleteIndex(request);
System.out.println(response.getRequestId());

Preguntas frecuentes

Referencias

  • También puede usar índices secundarios desde la consola o mediante la herramienta de línea de comandos. Para obtener más información, consulte Use secondary indexes in the console y Use secondary indexes by using the CLI.

  • Si necesita métodos de aceleración de consultas más flexibles y variados, como consultas combinadas de múltiples condiciones, búsqueda de texto completo, consultas por prefijo y consultas difusas, utilice índices de búsqueda. Para obtener más información, consulte Search index overview.