Os índices secundários aumentam a eficiência das consultas em diversos cenários. Crie um índice em colunas específicas para ordenar os dados da tabela de índice resultante por essas colunas. Ao gravar dados na tabela primária, o sistema sincroniza automaticamente as informações com a tabela de índice, o que permite consultas rápidas para recuperação de dados.
Cenário de exemplo
Em um cenário de consulta de registros de chamadas telefônicas, as informações de cada chamada são armazenadas em uma tabela de dados após o término da ligação.
A chave primária e as colunas predefinidas da tabela de dados são:
CellNumber e StartTime são as chaves primárias. Elas representam o número de origem e o horário de início da chamada, respectivamente.
CalledNumber, Duration e BaseStationNumber são colunas predefinidas. Elas correspondem ao número de destino, à duração da chamada e ao número da estação base, respectivamente.
A tabela a seguir apresenta dados de amostra. O modelo de tabela ampla do Tablestore organiza todas as linhas pela chave primária e oferece a operação de varredura sequencial (GetRange) para leitura de 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 |
Considere os seguintes requisitos de consulta. Recupere os dados necessários da tabela primária, de um índice secundário global ou de um índice secundário local, conforme a necessidade.
Consultar todos os registros de chamadas originadas pelo número 234567.
Listar todas as chamadas recebidas pelo número 123456.
Buscar registros de chamadas da estação base 002 iniciadas no timestamp 1532574740 ou posterior.
Obter a duração de todas as chamadas ocorridas na estação base 003 entre os timestamps 1532574861 e 1532584054.
Calcular a duração total, média, máxima e mínima das chamadas na estação base 003 entre os timestamps 1532574861 e 1532584054.
Recuperar todos os registros de chamadas do número de origem 456789 para o número de destino 345678.
Consulta de dados
Selecione o método de consulta adequado para cada requisito.
Métodos de implementação
A tabela a seguir descreve o método de implementação para cada requisito de consulta.
-
Para ver um exemplo de criação de tabela e índice secundário, consulte Appendix: Example of creating a data table and secondary indexes.
Após criar a tabela primária, grave os dados de amostra nela. O sistema sincroniza automaticamente os dados com a tabela de índice. Para mais detalhes sobre gravação de dados, consulte Write data.
O sistema preenche automaticamente a chave primária. Isso significa que as colunas de chave primária da tabela primária são adicionadas às colunas de índice para formar a chave primária da tabela de índice.
A primeira coluna de chave primária de um índice secundário local deve ser idêntica à primeira coluna de chave primária da tabela primária.
|
Requisito de consulta |
Método de implementação |
|
Consultar todos os registros de chamadas originadas pelo número 234567. |
Chame a interface getRange para varrer a tabela de dados. |
|
Listar todas as chamadas recebidas pelo número 123456. |
Crie um índice na coluna CalledNumber. Em seguida, chame a operação getRange para varrer a tabela de índice. |
|
Buscar registros de chamadas da estação base 002 iniciadas no timestamp 1532574740 ou posterior. |
Crie um índice composto nas colunas BaseStationNumber e StartTime. Depois, utilize a operação getRange para varrer a tabela de índice (um índice secundário global). |
|
Obter a duração de todas as chamadas ocorridas na estação base 003 entre os timestamps 1532574861 e 1532584054. |
Crie um índice composto nas colunas BaseStationNumber e StartTime e retorne apenas a coluna Duration. Em seguida, chame a operação getRange para varrer a tabela de índice (um índice secundário global). Consulte manualmente a tabela primária para obter o valor da coluna Duration ou inclua essa coluna como atributo na tabela de índice. Para calcular a duração total, média, máxima e mínima das chamadas na estação base 003 entre os timestamps 1532574861 e 1532584054, utilize o mesmo método de implementação e calcule os resultados finais com base na duração retornada para cada chamada. Nota
Use consultas SQL do Tablestore para eliminar a necessidade de cálculos no cliente. Uma instrução SQL recupera diretamente os resultados estatísticos finais. Para mais informações, consulte Query data. |
|
Recuperar todos os registros de chamadas do número de origem 456789 para o número de destino 345678. |
Crie um índice composto nas colunas CellNumber e CalledNumber e inclua as colunas Duration e BaseStationNumber como atributos na tabela de índice. Por fim, execute a operação getRange para varrer a tabela de índice (um índice secundário local). |
Consultar todos os registros de chamadas originadas pelo número 234567
Listar todas as chamadas recebidas pelo número 123456
Buscar registros de chamadas da estação base 002 iniciadas no timestamp 1532574740 ou posterior
Obter a duração de todas as chamadas ocorridas na estação base 003 entre os timestamps 1532574861 e 1532584054
Recuperar todos os registros de chamadas do número de origem 456789 para o número de destino 345678
Apêndice: Exemplo de criação de tabela de dados e índices secundários
O exemplo a seguir demonstra como criar a tabela primária e os índices secundários, incluindo índices locais e globais, utilizados neste tópico.
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));
// The time-to-live (TTL) of the data, in seconds. A value of -1 means that the data never expires. The TTL for a primary table with an index table must be -1.
int timeToLive = -1;
// The maximum number of versions to save. The max versions for a primary table with an index table must be 1.
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 index synchronization mode.
indexMeta3.setIndexUpdateMode(IUM_SYNC_INDEX);
// Set the index type to IT_LOCAL_INDEX (local secondary index).
indexMeta3.setIndexType(IT_LOCAL_INDEX);
indexMetas.add(indexMeta3);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas);
client.createTable(request);
}