Fitur indeks sekunder memungkinkan Anda membuat indeks pada kolom tertentu. Data dalam tabel indeks yang dihasilkan diurutkan berdasarkan kolom kunci indeks yang ditentukan. Semua data yang ditulis ke tabel data secara otomatis disinkronkan ke tabel indeks. Setelah menulis data ke tabel data, Anda dapat mengambil data dari tabel indeks yang dibuat untuk tabel tersebut, sehingga meningkatkan efisiensi kueri.
Contoh skenario
Topik ini menjelaskan cara menggunakan fitur indeks sekunder untuk mengkueri catatan telepon. Ketika panggilan telepon selesai, informasi tentang panggilan tersebut dicatat dalam tabel data.
Berikut adalah deskripsi kolom kunci utama dan kolom yang telah ditentukan sebelumnya dari tabel data:
Kolom CellNumber dan StartTime digunakan sebagai kolom kunci utama tabel data. Nilai dalam kolom CellNumber menunjukkan nomor pemanggil, sedangkan nilai dalam kolom StartTime menunjukkan waktu mulai panggilan telepon.
Kolom CalledNumber, Durasi, dan BaseStationNumber digunakan sebagai kolom yang telah ditentukan sebelumnya. Nilai dalam kolom CalledNumber menunjukkan nomor yang dipanggil, nilai dalam kolom Durasi menunjukkan durasi panggilan, dan nilai dalam kolom BaseStationNumber menunjukkan nomor stasiun pangkalan.
Tabel berikut menyajikan data sampel dalam tabel data. Model Wide Column Tablestore mengurutkan baris dalam tabel data berdasarkan kunci utama mereka dan menyediakan operasi GetRange untuk mengkueri data.
CellNumber | StartTime (UNIX timestamp) | CalledNumber | Durasi | 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 |
Anda dapat menggunakan tabel data, indeks sekunder global, atau indeks sekunder lokal untuk melakukan kueri berikut sesuai dengan kebutuhan bisnis Anda:
Kueri baris di mana nilai kolom CellNumber adalah 234567.
Kueri baris di mana nilai kolom CalledNumber adalah 123456.
Kueri baris di mana nilai kolom BaseStationNumber adalah 2 dan nilai kolom StartTime adalah 1532574740.
Kueri nilai kolom Durasi untuk baris di mana nilai kolom BaseStationNumber adalah 3 dan nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054.
Kueri total, rata-rata, maksimum, dan minimum durasi panggilan semua panggilan telepon yang diteruskan oleh stasiun pangkalan 3. Nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054.
Kueri baris di mana nilai kolom CellNumber adalah 456789 dan nilai kolom CalledNumber adalah 345678.
Kueri Data
Pilih metode yang sesuai untuk mengkueri data berdasarkan persyaratan kueri Anda.
Metode
Tabel berikut menjelaskan cara mengimplementasikan kueri yang berbeda.
Untuk informasi lebih lanjut tentang kode sampel yang digunakan untuk membuat tabel data dan tabel indeks sekunder, lihat Lampiran: Kode sampel untuk membuat tabel data dan tabel indeks sekunder.
Setelah membuat tabel data, Anda perlu menulis data sampel ke tabel data. Data dalam tabel data secara otomatis disinkronkan ke tabel indeks yang dibuat untuk tabel tersebut. Untuk informasi lebih lanjut tentang cara menulis data, lihat Tulis data.
Tablestore secara otomatis menambahkan kolom kunci utama tabel data yang tidak ditentukan sebagai kolom kunci indeks ke tabel indeks yang dibuat untuk tabel data. Kolom kunci utama tabel data dan kolom kunci indeks digunakan sebagai kolom kunci utama tabel indeks.
Jika Anda menggunakan indeks sekunder lokal, kolom kunci utama pertama tabel indeks harus sama dengan kolom kunci utama pertama tabel data tempat tabel indeks dibuat.
Kueri | Metode |
Kueri baris di mana nilai kolom CellNumber adalah 234567 | Anda dapat langsung memanggil operasi GetRange untuk memindai tabel data. |
Kueri baris di mana nilai kolom CalledNumber adalah 123456 | Buat tabel indeks berdasarkan kolom CalledNumber dan panggil operasi GetRange untuk memindai tabel indeks. |
Kueri baris di mana nilai kolom BaseStationNumber adalah 2 dan nilai kolom StartTime adalah 1532574740 | Buat tabel indeks berdasarkan kolom BaseStationNumber dan StartTime, lalu panggil operasi GetRange untuk memindai tabel indeks yang tipe indeksnya adalah indeks sekunder global. |
Kueri nilai kolom Durasi untuk baris di mana nilai kolom BaseStationNumber adalah 3 dan nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054 | Buat tabel indeks berdasarkan kolom BaseStationNumber dan StartTime, tentukan bahwa hanya nilai kolom Durasi yang dikembalikan, lalu panggil operasi GetRange untuk memindai tabel indeks yang tipe indeksnya adalah indeks sekunder global. Secara manual, Anda dapat mengkueri nilai kolom Durasi dari tabel data atau menentukan kolom Durasi sebagai kolom atribut tabel indeks. Untuk mengkueri total, rata-rata, maksimum, dan minimum durasi panggilan semua panggilan telepon yang diteruskan oleh stasiun pangkalan 3 dengan waktu mulai berkisar dari 1532574861 hingga 1532584054, gunakan metode ini. Kemudian, lakukan agregasi pada kolom Durasi untuk mendapatkan hasil akhir. Catatan Anda juga dapat mengeksekusi pernyataan SQL untuk mendapatkan hasil tanpa perhitungan sisi klien. Untuk informasi lebih lanjut, lihat Kueri data. |
Kueri baris di mana nilai kolom CellNumber adalah 456789 dan nilai kolom CalledNumber adalah 345678 | Buat tabel indeks berdasarkan kolom CellNumber dan CalledNumber, tentukan kolom Durasi dan BaseStationNumber sebagai kolom atribut tabel indeks, lalu panggil operasi GetRange untuk memindai tabel indeks yang tipe indeksnya adalah indeks sekunder lokal. |
Kueri baris di mana nilai kolom CellNumber adalah 234567
Kueri baris di mana nilai kolom CalledNumber adalah 123456
Kueri baris di mana nilai kolom BaseStationNumber adalah 2 dan nilai kolom StartTime adalah 1532574740
Kueri nilai kolom Durasi untuk baris di mana nilai kolom BaseStationNumber adalah 3 dan nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054
Kueri baris di mana nilai kolom CellNumber adalah 456789 dan nilai kolom CalledNumber adalah 345678
Lampiran: Kode sampel untuk membuat tabel data dan tabel indeks sekunder
Kode sampel berikut menunjukkan cara membuat tabel data dan tabel indeks sekunder yang digunakan dalam topik ini. Tipe indeks mencakup indeks sekunder lokal dan indeks sekunder 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 = "Durasi";
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));
// Tentukan Time to Live (TTL) data. Unit: detik. Nilai -1 menunjukkan bahwa data tidak pernah kedaluwarsa. Anda harus menetapkan nilai timeToLive ke -1 jika tabel data memiliki satu atau lebih tabel indeks.
int timeToLive = -1;
// Tentukan jumlah maksimum versi data yang dapat disimpan. Anda harus menetapkan nilai maxVersions ke 1 jika tabel data memiliki satu atau lebih tabel indeks.
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);
// Tetapkan nilai indexUpdateMode ke IUM_SYNC_INDEX.
indexMeta3.setIndexUpdateMode(IUM_SYNC_INDEX);
// Tetapkan nilai indexType ke IT_LOCAL_INDEX.
indexMeta3.setIndexType(IT_LOCAL_INDEX);
indexMetas.add(indexMeta3);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas);
client.createTable(request);
}