O recurso de índice secundário permite criar um índice em colunas específicas. Os dados na tabela de índice gerada são classificados com base nas colunas de chave de índice definidas. Todos os dados gravados na tabela de dados são sincronizados automaticamente para a tabela de índice. Após gravar dados na tabela de dados, consulte-os na tabela de índice criada para essa tabela para aumentar a eficiência da consulta.
Cenário de exemplo
Este tópico descreve como usar o recurso de índice secundário para consultar registros telefônicos. Quando uma chamada termina, as informações sobre ela são registradas em uma tabela de dados.
A seção a seguir descreve as colunas de chave primária e as colunas predefinidas da tabela de dados:
As colunas CellNumber e StartTime funcionam como colunas de chave primária da tabela de dados. Cada valor na coluna CellNumber indica um número de origem da chamada, e cada valor na coluna StartTime indica o horário de início da chamada.
As colunas CalledNumber, Duration e BaseStationNumber funcionam como colunas predefinidas da tabela de dados. Cada valor na coluna CalledNumber indica um número chamado, cada valor na coluna Duration indica a duração da chamada e cada valor na coluna BaseStationNumber indica o número da estação base.
A tabela a seguir apresenta os dados de exemplo na tabela de dados. O modelo Wide Column do Tablestore classifica as linhas em uma tabela de dados com base em suas chaves primárias e fornece a operação GetRange para consultar dados.
|
CellNumber |
StartTime (UNIX timestamp) |
CalledNumber |
Duration |
BaseStationNumber |
|
123456 |
1532574644 |
654321 |
60 |
1 |
|
234567 |
1532574714 |
765432 |
10 |
1 |
|
234567 |
1532574734 |
123456 |
20 |
3 |
|
345678 |
1532574795 |
123456 |
5 |
2 |
|
345678 |
1532574861 |
123456 |
100 |
2 |
|
456789 |
1532584054 |
345678 |
200 |
3 |
Use tabelas de dados, índices secundários globais ou índices secundários locais para executar as seguintes consultas conforme seus requisitos de negócio:
Consultar as linhas em que o valor da coluna CellNumber é 234567.
Consultar as linhas em que o valor da coluna CalledNumber é 123456.
Consultar as linhas em que o valor da coluna BaseStationNumber é 2 e o valor da coluna StartTime é 1532574740.
Consultar os valores da coluna Duration para as linhas em que o valor da coluna BaseStationNumber é 3 e o valor da coluna StartTime varia de 1532574861 a 1532584054.
Consultar a duração total, média, máxima e mínima de todas as chamadas encaminhadas pela estação base 3. O valor da coluna StartTime varia de 1532574861 a 1532584054.
Consultar as linhas em que o valor da coluna CellNumber é 456789 e o valor da coluna CalledNumber é 345678.
Consultas de dados
Selecione um método adequado para consultar dados com base nos seus requisitos de consulta.
Métodos
A tabela a seguir descreve como implementar diferentes consultas.
-
Para obter mais informações sobre o código de exemplo usado para criar uma tabela de dados e uma tabela de índice secundário, consulte Apêndice: Código de exemplo para criar a tabela de dados e as tabelas de índice secundário.
Após criar uma tabela de dados, grave dados de exemplo nela. Os dados na tabela de dados são sincronizados automaticamente para a tabela de índice criada para ela. Para obter mais informações sobre como gravar dados, consulte Gravar dados.
O Tablestore adiciona automaticamente as colunas de chave primária de uma tabela de dados não especificadas como colunas de chave de índice à tabela de índice criada para essa tabela de dados. As colunas de chave primária da tabela de dados e a coluna de chave de índice funcionam como colunas de chave primária da tabela de índice.
Ao usar um índice secundário local, a primeira coluna de chave primária da tabela de índice deve ser igual à primeira coluna de chave primária da tabela de dados para a qual a tabela de índice foi criada.
Consulta | Método |
Consultar as linhas em que o valor da coluna CellNumber é 234567 | Chame diretamente a operação GetRange para verificar a tabela de dados. |
Consultar as linhas em que o valor da coluna CalledNumber é 123456 | Crie uma tabela de índice com base na coluna CalledNumber e chame a operação GetRange para verificar a tabela de índice. |
Consultar as linhas em que o valor da coluna BaseStationNumber é 2 e o valor da coluna StartTime é 1532574740 | Crie uma tabela de índice com base nas colunas BaseStationNumber e StartTime e chame a operação GetRange para verificar a tabela de índice cujo tipo de índice é índice secundário global. |
Consultar os valores da coluna Duration para as linhas em que o valor da coluna BaseStationNumber é 3 e o valor da coluna StartTime varia de 1532574861 a 1532584054 | Crie uma tabela de índice com base nas colunas BaseStationNumber e StartTime, especifique que apenas os valores da coluna Duration sejam retornados e, em seguida, chame a operação GetRange para verificar a tabela de índice cujo tipo de índice é índice secundário global. Consulte manualmente os valores da coluna Duration na tabela de dados ou especifique a coluna Duration como uma coluna de atributo da tabela de índice. Para consultar a duração total, média, máxima e mínima de todas as chamadas encaminhadas pela estação base 3 e cujo horário de início varia de 1532574861 a 1532584054, também use este método de consulta. Em seguida, execute agregação na coluna Duration para obter os resultados finais. Nota Execute instruções SQL para obter os resultados sem cálculos no lado do cliente. Para obter mais informações, consulte Consultar dados. |
Consultar as linhas em que o valor da coluna CellNumber é 456789 e o valor da coluna CalledNumber é 345678 | Crie uma tabela de índice com base nas colunas CellNumber e CalledNumber, especifique as colunas Duration e BaseStationNumber como colunas de atributo da tabela de índice e, em seguida, chame a operação GetRange para verificar a tabela de índice cujo tipo de índice é índice secundário local. |
Consultar as linhas em que o valor da coluna CellNumber é 234567
Consultar as linhas em que o valor da coluna CalledNumber é 123456
Consultar as linhas em que o valor da coluna BaseStationNumber é 2 e o valor da coluna StartTime é 1532574740
Consultar os valores da coluna Duration para as linhas em que o valor da coluna BaseStationNumber é 3 e o valor da coluna StartTime varia de 1532574861 a 1532584054
Consultar as linhas em que o valor da coluna CellNumber é 456789 e o valor da coluna CalledNumber é 345678
Apêndice: Código de exemplo para criar a tabela de dados e as tabelas de índice secundário
O código de exemplo a seguir mostra como criar a tabela de dados e as tabelas de índice secundário usadas neste tópico. Os tipos de índice incluem índice secundário local e índice secundário global.
private static final String TABLE_NAME = "CallRecordTable";
private static final String INDEX0_NAME = "IndexOnBeCalledNumber";
private static final String INDEX1_NAME = "IndexOnBaseStation1";
private static final String INDEX2_NAME = "IndexOnBaseStation2";
private static final String INDEX3_NAME = "LocalIndexOnBeCalledNumber";
private static final String PRIMARY_KEY_NAME_1 = "CellNumber";
private static final String PRIMARY_KEY_NAME_2 = "StartTime";
private static final String DEFINED_COL_NAME_1 = "CalledNumber";
private static final String DEFINED_COL_NAME_2 = "Duration";
private static final String DEFINED_COL_NAME_3 = "BaseStationNumber";
private static void createTable(SyncClient client) {
TableMeta tableMeta = new TableMeta(TABLE_NAME);
tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_1, PrimaryKeyType.INTEGER));
tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_2, PrimaryKeyType.INTEGER));
tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_1, DefinedColumnType.INTEGER));
tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_2, DefinedColumnType.INTEGER));
tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_3, DefinedColumnType.INTEGER));
// Specify the Time to Live (TTL) of data. Unit: seconds. The value -1 indicates that the data never expires. You must set the value of timeToLive to -1 if a data table has one or more index tables.
int timeToLive = -1;
// Specify the maximum number of data versions that can be retained. You must set the value of maxVersions to 1 if a data table has one or more index tables.
int maxVersions = 1;
TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
ArrayList<IndexMeta> indexMetas = new ArrayList<IndexMeta>();
IndexMeta indexMeta0 = new IndexMeta(INDEX0_NAME);
indexMeta0.addPrimaryKeyColumn(DEFINED_COL_NAME_1);
indexMetas.add(indexMeta0);
IndexMeta indexMeta1 = new IndexMeta(INDEX1_NAME);
indexMeta1.addPrimaryKeyColumn(DEFINED_COL_NAME_3);
indexMeta1.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
indexMetas.add(indexMeta1);
IndexMeta indexMeta2 = new IndexMeta(INDEX2_NAME);
indexMeta2.addPrimaryKeyColumn(DEFINED_COL_NAME_3);
indexMeta2.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
indexMeta2.addDefinedColumn(DEFINED_COL_NAME_2);
indexMetas.add(indexMeta2);
IndexMeta indexMeta3 = new IndexMeta(INDEX3_NAME);
indexMeta3.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
indexMeta3.addPrimaryKeyColumn(DEFINED_COL_NAME_1);
indexMeta3.addDefinedColumn(DEFINED_COL_NAME_2);
indexMeta3.addDefinedColumn(DEFINED_COL_NAME_3);
// Set the value of indexUpdateMode to IUM_SYNC_INDEX.
indexMeta3.setIndexUpdateMode(IUM_SYNC_INDEX);
// Set the value of indexType to IT_LOCAL_INDEX.
indexMeta3.setIndexType(IT_LOCAL_INDEX);
indexMetas.add(indexMeta3);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas);
client.createTable(request);
}